添加沒有App.Config的DbProviderFactory

ado.net dbproviderfactories entity-framework sqlite

我在我的數據層(基於實體框架)中使用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合法嗎? 是的,了解原因