Jas*_*ver 37 sqlite ado.net entity-framework dbproviderfactories
我在我的数据层(基于实体框架)中使用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>
Run Code Online (Sandbox Code Playgroud)
相反,我想让我的数据层以编程方式放入.有人知道这样做的方法吗?
编辑:
这样做的原因是我使用IoC容器来选择数据层,而我的一些数据层不需要App.Config值,或者让它们与数据层紧密相连.
Jos*_*ers 53
以下可能会导致太阳黑子和推翻西方文明.它甚至可能引发关于管道磁带编程的讨论(让它停止!),但它的工作原理(现在)
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) { }
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
迟到的答复:
你总是可以像这样直接获得一个工厂:
DbProviderFactory factory = System.Data.SQLite.SQLiteFactory.Instance;
// (note that the rest of the code is still provider-agnostic.)
Run Code Online (Sandbox Code Playgroud)
或者使用 IoC 容器来解析DbProviderFactory,例如:
container.RegisterInstance<DbProviderFactory>(SQLiteFactory.Instance);
Run Code Online (Sandbox Code Playgroud)
我不想使用它,DbProviderFactories.GetFactory因为它需要配置文件(或像@JoshRiver 的答案中那样的黑客)。
所做DbProviderFactories.GetFactory的就是,它使用提供程序名称查找已注册的工厂类型的程序集限定名称,然后使用反射获取静态属性的值Instance。
如果您不想使用该配置,根据您的用例,上述方法之一可能更方便。
| 归档时间: |
|
| 查看次数: |
22001 次 |
| 最近记录: |