我不想修改我的machine.config,但我想将Npgsql库用作数据提供程序。我将我的应用程序部署到多个平台(包括单声道),所以我真的希望“正常工作”而不是给我错误“无法找到所请求的.Net Framework数据提供程序。”
有没有办法在运行时“注册”Npgsql作为数据提供者,所以这不会发生?
我应该澄清Npgsql在大多数情况下没有在我的machine.config中工作正常,但是有一些它不能很好地工作(比如NLog--我沮丧的当前来源)。
答案 0 :(得分:5)
我发现了如何做我需要做的事情;它不是“运行时”但足够接近,我没有必要修改我的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>
......它开始像冠军一样工作。
答案 1 :(得分:0)
您将不得不求助于使用Reflection(该代码适用于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);