App.ConfigなしでDbProviderFactoryを追加します。

ado.net dbproviderfactories entity-framework sqlite

質問

私は自分のデータ層(Entity Frameworkに基づく)でDbProviderFactoriesを使用していて、私のデータベースにはSQLiteを使用していますが、次のコードを取得するためにApp.Configを用意する必要はありません。

<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite"/>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
</configuration>

代わりに、私は私のデータ層にプログラム的にそれを入れてもらいたいです。誰もがこれを行う方法を知っていますか?

編集:

これは、データ層の選択にIoCコンテナを使用しており、一部のデータ層がApp.Config値を必要としないか、データ層に固定されているためです。

受け入れられた回答

以下はおそらく黒点を引き起こし、西洋文明を打倒するでしょう。それはダクトテーププログラミングについての議論を引き起こすかもしれません(それをやめさせる!)が、(今のところ)うまくいきます

try
{
    var dataSet = ConfigurationManager.GetSection("system.data") as System.Data.DataSet;
    dataSet.Tables[0].Rows.Add("SQLite Data Provider"
    , ".Net Framework Data Provider for SQLite"
    , "System.Data.SQLite"
    , "System.Data.SQLite.SQLiteFactory, System.Data.SQLite");
}
catch (System.Data.ConstraintException) { }

人気のある回答

上記のJoshRiversがSQLite用のソリューションを投稿しました。これは他のアダプタにも実際に使用することができます - 私は彼の例を使用してそれをMySQL用に動作させることができました。私はこれをもう少し一般的なものにまとめました。これはアプリケーションの起動後に実行する必要があり、.NETコネクタバージョン6.6.5.0用です(ただし、他のバージョンでも同様に適していると思います)。

string dataProvider = @"MySql.Data.MySqlClient";
string dataProviderDescription = @".Net Framework Data Provider for MySQL";
string dataProviderName = @"MySQL Data Provider";
string dataProviderType = @"MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.6.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d";

bool addProvider = true;
var dataSet = ConfigurationManager.GetSection("system.data") as DataSet;
foreach (DataRow row in dataSet.Tables[0].Rows)
{
    if ((row["InvariantName"] as string) == dataProvider)
    {
        // it is already in the config, no need to add.
        addProvider = false;
        break;
    }
}

if (addProvider)
    dataSet.Tables[0].Rows.Add(dataProviderName, dataProviderDescription, dataProvider, dataProviderType);


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ