web-dev-qa-db-ja.com

.NETMySQLコネクタが競合するDbProviderFactories

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にあることが原因である可能性があります。

解決策は何ですか?アプリケーションを構築するシステムに応じて、行を手動でコメント化およびコメント解除する必要はありません。

22
Kekoa

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>
46
Alexandre Jobin

すべてのmysqlDLLをC:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3\Assemblies\v4.0からプロジェクトのbinフォルダーにコピーすることも検討できます。このようにして、EF6は必要なすべてのMySQLコネクタ(MySql.Data)サブクラスに到達できます。

0
bilmuhfk