68224


お力添えをお願いします。  
初めてEF6を利用する者です。  
下記コード実行時、LINQのところで、  
接続用の文字列（connectionStrings）の定義が誤っているという旨のエラーメッセージが表示されます。  
本当に誤っているのか、誤っているとすればどこかをご教示願います。

[code]

    internal static class 画面01_Model
    {
        internal static IEnumerable<User> GetItems(string keyword_)
        {
            using (DBContextUser db = new DBContextUser())
            {
                string searchWord = "";
                if (keyword_ != null) searchWord = keyword_;
                var result =
                    from u in db.Users
                    where u.Name.Contains(searchWord)
                    select u;
                foreach (User one in result)
                {
                    yield return one;
                }
            }
        }
    }
    
[/code]

環境／インストール済みパッケージ：  
_PostgreSQL 9.4.5_  
_Visual Studio Express 2015_  
_Entity Framework：v6.4.4_  
_EntityFramework6.Npgsql：v6.4.1_  
_Npgsql：4.0.10_  
_NUnit：3.12.0_  
_NUnit.ConsoleRunner：3.11.1_  
_NUnit3TestAdapter：3.16.1_

app.config（一部抜粋）：

[code]

        <connectionStrings>
            <add name="ＸＸＸシステム.Properties.Settings.DefaultConnectionPGSQL"
                connectionString="Data Source=192.168.x.xx;User ID=yyy;Password=zzz;Database=tamib;"
                providerName="Npgsql.EntityFramework;" />
        </connectionStrings>
        <entityFramework>
            <providers>
                <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
                <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql"/>
            </providers>
            <defaultConnectionFactory type="Npgsql.NpgsqlConnectionFactory, EntityFramework6.Npgsql"/>
        </entityFramework>
    <system.data>
        <DbProviderFactories>
          <remove invariant="Npgsql" />
          <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
    </system.data>
    
[/code]

エラーメッセージ：

> 型 'System.Configuration.ConfigurationErrorsException' のハンドルされていない例外が  
>  System.Configuration.dll で発生しました  
>  初期化文字列の形式が使用に適合しません。Index 0 で始まっています。

※「使用」は「仕様」の誤りと思われます  
よろしくお願いします。

参考図書：  
『ひと目でわかる Visual C# 2015 アプリケーション開発入門』伊藤 達也／著 日経BP社 日経BPマーケティング 2016.10

**【追記】**  
指摘があったので、下記のようにconnectionStringを編集しましたが、エラーメッセージは変わりませんでした；

[code]

    <connectionStrings>
        <add name="ＸＸＸシステム.Properties.Settings.DefaultConnectionPGSQL" 
            connectionString="Server=192.168.x.xx;Port=5432;Username=yyy;Password=zzz;Database=tamib;"
            providerName="Npgsql.EntityFramework;" />
    </connectionStrings>
    <system.data>
        <DbProviderFactories>
          <remove invariant="Npgsql" />
          <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" support="FF" />
        </DbProviderFactories>
    </system.data>
    
[/code]

また、この他にも Data Source（Server）の部分をHostに変更して試したりもしましたが、エラーメッセージは変わらず、  
「初期化文字列の形式が使用に適合しません。Index 0 で始まっています。」でした。

**【追記２】**  
下記コードにより、connectionStringを用いたPostgreSQLへの接続を試した結果、データ取得まで成功しました；

[code]

            string connString
                = ConfigurationManager.ConnectionStrings["ＸＸＸシステム.Properties.Settings.DefaultConnectionPGSQL"]?.ConnectionString;
            var conn = new NpgsqlConnection(connString);
            conn.Open();
    
[/code]

* * *

**【追記３】**  
本記事後のエラー

> "The ADO.NET provider with invariant name 'Npgsql.EntityFramework;' is
> either not registered in the machine or application config file, or could
> not be loaded. See the inner exception for details."

への対応を記載します。結論としては、app.configの記述誤りが理由でした；

connectionString の providerName属性の値を entityFramework>に合わせて、  
"Npgsql.EntityFramework;"→"Npgsql"  
（セミコロンは入力しない）  
と変更することで、正常に動作しました。

[code]

    <connectionStrings>
        <add name="ＸＸＸシステム.Properties.Settings.DefaultConnectionPGSQL" connectionString="Server=192.168.x.xx;Port=5432;Username=yyy;Password=zzz;Database=tamib;"
            providerName="Npgsql" />
    </connectionStrings>
    
[/code]


CC BY-SA 4.0
2020-07-01T06:29:56.853
68171
2020-07-03T04:46:19.240
2020-07-03T04:46:19.240
38266
38266
question
c# postgresql entity-framework
EF6でのPostgreSQLへの接続について


[接続文字列のエラーメッセージ](http://surferonwww.info/BlogEngine/post/2012/07/24/error-
message-for-conection-string.aspx)からの類推で「Index 0
で始まっています。」ということは先頭から間違っているらしいですね。

そこで検索したら先頭の`Data Source=`は`SQLServer`用で、`postgreSQL`では`Server=`になると思われます。  
それから`Port=`のポート番号指定の不足でしょうか。  
[EntityFramework
6（C＃）を使用してPostgreSQLデータベースに接続する](https://entityframework.net/ja/knowledge-
base/37838170/)  
[Set a connectionString for a PostgreSQL database in Entity Framework outside
the app.config](https://stackoverflow.com/q/39018552/9014308)  
[PostgreSQL database connection in asp.net mvc and Entity Framework
6](https://stackoverflow.com/q/36558564/9014308)

そして質問には書かれておらず対処済みかもしれませんが、`<providers>`や`<system.data><DbProviderFactories>`のセクションにも追加が必要なようです。

試してみてください。

* * *

ちなみに[The Connection Strings
Reference](https://www.connectionstrings.com/)というサイトがあって、Npgsqlの情報もあったのですが、特に不足しているようには見えませんでした。

Npgsqlのページはこちら  
[Npgsql connection strings](https://www.connectionstrings.com/npgsql/)

* * *

そしてこちらの記事の方が上記紹介したサイトの元のようです。  
内容は変わらないのですが、コメントで何か記述が増えています。  
[Connect to PostgreSQL database using EntityFramework 6
(C#)](https://stackoverflow.com/q/37838170/9014308)

こちらは解決していないけれど3つくらい回答が付いています。  
[how to create postgreSQL database using EF code
first](https://stackoverflow.com/q/19183855/9014308)

それから、こちらの記事の後半でデータベースコンテキストクラスでbaseにコネクションストリングを指定するとか、パラメータにスキーマ名を指定するとかの使い方が記述されています。  
[Using PostgreSQL with Entity
Framework](https://schneide.blog/2017/09/26/using-postgresql-with-entity-
framework/)

何か参考になれば。

* * *

上記最後の紹介記事とか、@k systemさん回答とかの元資料になる記事がこちら。

[接続文字列とモデル](https://docs.microsoft.com/ja-
jp/ef/ef6/fundamentals/configuring/connection-strings)  
[規則による接続とデータベース名を指定して Code First を使用する](https://docs.microsoft.com/ja-
jp/ef/ef6/fundamentals/configuring/connection-strings#use-code-first-with-
connection-by-convention-and-specified-database-name)  
[App.config/web.config ファイルで接続文字列を使用して Code First
を使用する](https://docs.microsoft.com/ja-
jp/ef/ef6/fundamentals/configuring/connection-strings#use-code-first-with-
connection-string-in-appconfigwebconfig-file)


CC BY-SA 4.0
2020-07-01T23:23:08.100
68197
2020-07-02T17:18:01.003
2020-07-02T17:18:01.003
26370
26370
68171
answer


> 本当に誤っているのか、誤っているとすればどこかをご教示願います。

`DBContextUser` の コンストラクタの部分を確認願います。

[code]

    public DBContextUser()
      : base("ＸＸＸシステム.Properties.Settings.DefaultConnectionPGSQL")
    {
    }
    
[/code]

となっていれば動作すると思いますが base("＊＊") の `＊＊` の部分が 違っていると

[code]

    var con = db.Database.Connection;
    
[/code]

のように DB接続を取得するときに、

`「System.ArgumentException: '初期化文字列の形式が使用に適合しません。index 0 で始まっています。'」`  
のエラーが発生しました。

接続文字列を取得する前の段階でエラーが出ているようです。


CC BY-SA 4.0
2020-07-02T15:57:34.627
68224
2020-07-02T15:57:34.627
18851
68171
answer