Entity Framework4で.NETMySQL Connectorを使用していて、すべてがうまく機能しましたが、サーバーにデプロイしたときにMySQLクライアントDLLファイルをアプリケーションと一緒にパッケージ化したかったので、各サーバーにmysqlをインストールすることを心配するために、各アプリケーションには必要な正しいコピーがあります。
これを可能にするために、MySQL参照に「ローカルコピー」が設定されていることを確認して、binフォルダーにコピーし、app.configに以下を追加しました。
<system.data>
<DbProviderFactories>
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.3.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
これは機能し、リモートサーバーにmysqlをインストールせずにアプリをデプロイできますが、ローカル開発マシンで問題が発生します(ここでdoMySQLコネクタがインストールされています)、EFが接続しようとするとこのエラーが発生します:
列 'InvariantName'は一意になるように制約されています。値 'MySql.Data.MySqlClient'は既に存在します。
上記でapp.configに追加したXMLをコメントアウトすると、エラーはなくなります。これは、同じドライバーがシステムにインストールされ、machine.configにあることが原因である可能性があります。
解決策は何ですか?アプリケーションを構築するシステムに応じて、行を手動でコメント化およびコメント解除する必要はありません。
webconfigに<remove invariant = "MySql.Data.MySqlClient" />を追加してみてください。コンピューターにMySql用のコネクターをインストールし、DbProviderFactoriesに項目を追加してmachine.configを変更しました。したがって、別のMySqlデータプロバイダーをweb.configに配置すると、同じものを2回登録しようとしている場合と同じようになります。
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.3.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
すべてのmysqlDLLをC:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3\Assemblies\v4.0
からプロジェクトのbinフォルダーにコピーすることも検討できます。このようにして、EF6は必要なすべてのMySQLコネクタ(MySql.Data)サブクラスに到達できます。