我不想修改我的machine.config,但我想使用Npgsql庫作爲數據提供者。我將部署我的應用程序到多個平臺(包括單聲道),所以我真的很喜歡「只是工作」,而不是給我錯誤「無法找到所需的.Net Framework數據提供程序」。有沒有辦法在運行時動態加載數據提供者?
有沒有辦法在運行時「註冊」Npgsql作爲數據提供程序,所以這不會發生?
我應該澄清,Npgsql在大多數情況下都不會出現在我的machine.config中,但它有一些不適用於(比如NLog--我當前的挫折感)。
我不想修改我的machine.config,但我想使用Npgsql庫作爲數據提供者。我將部署我的應用程序到多個平臺(包括單聲道),所以我真的很喜歡「只是工作」,而不是給我錯誤「無法找到所需的.Net Framework數據提供程序」。有沒有辦法在運行時動態加載數據提供者?
有沒有辦法在運行時「註冊」Npgsql作爲數據提供程序,所以這不會發生?
我應該澄清,Npgsql在大多數情況下都不會出現在我的machine.config中,但它有一些不適用於(比如NLog--我當前的挫折感)。
我發現如何做我需要做的事情;它不是很「運行時」,但足夠接近,我不必修改我的machine.config。我將這部分添加到我的web.config文件中:
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider" invariant="Npgsql" description=".NET Framework Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
...並且它開始像冠軍一樣工作。
您將不得不求助於使用反射(代碼是爲Microsoft .NET Framework,因此您將不得不驗證專用字段是否在Mono中相同)。
using System.Data.Common;
// 1. Initialize the default configuration
DbProviderFactories.GetFactoryClasses();
// 2. Retrieve the configuration table.
var config = (DataTable)typeof(DbProviderFactories).GetField("_providerTable", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
// 3. Add a new entry in the configuration (replace the values with ones for your provider).
DataRow dataRow = config.NewRow();
dataRow["Name"] = "SqlClient Data Provider";
dataRow["InvariantName"] = typeof(SqlConnection).Namespace.ToString();
dataRow["Description"] = ".Net Framework Data Provider for SqlServer";
dataRow["AssemblyQualifiedName"] = typeof(SqlConnection).AssemblyQualifiedName;
config.Rows.Add(dataRow);
我會試試這個,謝謝。 –
這似乎沒有做任何事情。是否有可能需要重新初始化提供程序工廠列表的另一個命令? –