为了支持不带app.config的EF6数据库提供程序,通常需要
DbConfiguration
DbProviderFactory
和
DbProviderServices
分别使用
SetProviderFactory
和
SetProviderServices
方法。
但是,这对于SQLite提供程序来说是不够的,因为它没有实现
IProviderInvariantName
导致运行时异常的服务。所以您需要通过自定义
IDbDependencyResolver
AddDependencyResolver
方法。
假设类库项目引用了
System.Data.SQLite
和
System.Data.SQLite.EF6
程序集和连接字符串使用
"System.Data.SQLite.EF6"
providerName
,将以下实现类添加到类库项目中:
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Infrastructure.DependencyResolution;
using System.Data.SQLite.EF6;
using System.Data.SQLite;
class SQLiteProviderInvariantName : IProviderInvariantName
{
public static readonly SQLiteProviderInvariantName Instance = new SQLiteProviderInvariantName();
private SQLiteProviderInvariantName() { }
public const string ProviderName = "System.Data.SQLite.EF6";
public string Name { get { return ProviderName; } }
}
class SQLiteDbDependencyResolver : IDbDependencyResolver
{
public object GetService(Type type, object key)
{
if (type == typeof(IProviderInvariantName))
{
if (key is SQLiteProviderFactory || key is SQLiteFactory)
return SQLiteProviderInvariantName.Instance;
}
return null;
}
public IEnumerable<object> GetServices(Type type, object key)
{
var service = GetService(type, key);
if (service != null) yield return service;
}
}
然后,再次将以下配置类(或更新现有的配置类(如果您已经有一个配置类))添加到包含上下文类的类库项目中:
using System.Data.Entity;
using System.Data.Entity.Core.Common;
using System.Data.SQLite.EF6;
class MyDbConfiguration : DbConfiguration
{
public MyDbConfiguration()
{
SetProviderFactory(SQLiteProviderInvariantName.ProviderName, SQLiteProviderFactory.Instance);
SetProviderServices(SQLiteProviderInvariantName.ProviderName, (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
AddDependencyResolver(new SQLiteDbDependencyResolver());
}
}
<add name="MyDb_SQLite" providerName="System.Data.SQLite.EF6" connectionString="Data Source =|DataDirectory|MyDb.sqlite" />
有关详细信息,请参见
Code-based configuration
以及EF6文档的相关主题。请注意,类库是
不
应用程序,所以
配置文件实际上是指可执行的配置文件。无法使用类库配置文件强制EF6,因此基于代码的配置和可执行配置文件是唯一的选项。