我正在构建一个 mvc 应用程序。我在 system.data 的 web.config 中有这个:
<system.data>
<DbProviderFactories>
<remove invariant ="System.Data.SqlClient" />
<remove invariant="System.Data.Odbc" />
<remove invariant="System.Data.Oledb" />
<remove invariant="System.Data.OracleClient" />
<add name="SqlClient Data Provider"
invariant="System.Data.SqlClient"
description=".Net Framework Data Provider for SqlServer"
type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</DbProviderFactories>
此提供程序来自 nuget 项目中的引用,而不是 GAC 中的引用。在 GAC 我有:
在 DemoController 我有:
DataTable table = DbProviderFactories.GetFactoryClasses();
DbProviderFactory msSqlDbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
var dbProviderFactories = new string[table.Rows.Count+1,table.Columns.Count+1]; //+1 for readability in display
ushort i = 0, j = 0;
foreach (DataRow row in table.Rows)
{
foreach (DataColumn column in table.Columns)
{
dbProviderFactories[i, j] = row[column].ToString();
j++;
}
j = 0;
i++;
}
结果,您可以在屏幕截图中看到。DbProviderFactories 的非常奇怪的行为
谁能告诉我为什么所有提供者(ole、oracle、odbc)仍然存在,即使我已经在配置中删除了它们?谁能告诉我为什么在我可以调用的工厂数组中没有像 SqlCleint 这样的工厂
DbProviderFactory msSqlDbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
还是得到工厂?这是我无法解释的奇怪行为。
我这样做时遇到了这个问题: 1. 当 web.config 中有这样的连接字符串时,使用默认 ctor 初始化 DbContext:
<connectionStrings>
<add name="MyDbContext"
connectionString="Data Source=MSSQL-SERVER-INSTANCE;Initial Catalog=MyDb.mdf;Trusted_Connection=False;User ID=u;Password=p"
providerName="System.Data.SqlClient"/>
</connectionStrings>
- 尝试将 DbMigrator 与 DbMigrationConfig 一起使用,如下所示:
string connectionString = "数据源=MSSQL-SERVER-INSTANCE;初始目录=MyDb.mdf;Trusted_Connection=False;用户ID=u;密码=p";
DbMigrationsConfiguration<InitDbContext> cfg = new DbMigrationsConfiguration<InitDbContext>
{
AutomaticMigrationsEnabled = true,
MigrationsAssembly = Assembly.Load("Migrations"),
MigrationsNamespace = "Migrations",
TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient")
};
DbMigrationsConfiguration cfg = CreateMigrationsConfig(connectionString);
new DbMigrator(cfg).Update();
这里出现了令人讨厌的“无法找到请求的 .Net Framework 数据提供程序”。