我正在尝试创建一个插件,它将使用EF6.1和SQLite为一个应用程序提供服务,但我无法更改App.config文件,所以所有的配置和连接字符串都需要在代码中设置。
我发现了这个看起来很有前途的答案:Problems using Entity Framework 6 and SQLite
现在我有一个像这样的配置类:
public class CollectionDbConfiguration : DbConfiguration
{
public CollectionDbConfiguration()
{
SetProviderServices("System.Data.SQLite"(DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
}
}
在第一次创建上下文并返回所有这些返回值之前,我已确认会执行此操作。
我的上下文看起来像这样
public class MyContext : DbContext
{
public MyContext(string connectionString)
: base(connectionString) { }
public DbSet<MyEntity> MyEntities { get; set; }
}
我有一些调用它的代码,如下所示:
var context = new MyContext("Data Source = mytest.db; Version = 3;");
var entities = context.MyEntities.ToList();
当我尝试运行代码时,上下文似乎默认连接字符串是针对 SQL Server 的,因此它会给出:“关键字不受支持:'version'。” 如果我删除它,则会收到一个错误,指出无法连接并且明显尝试连接到 SQL Server 数据库。 我尝试通过添加构造函数传递 SQLite 连接:public MyContext(DbConnection connection)
: base(connection, contextOwnsConnection: true)
{ }
使用此调用:
var context = new MyContext(new SQLiteConnection("Data Source = mytest.db; Version = 3;"));
var entities = context.MyEntities.ToList();
但是我遇到了这个错误:
无法确定类型为'System.Data.SQLite.SQLiteConnection'的连接所需的DbProviderFactory类型。请确保已在应用程序配置中安装或注册ADO.NET提供程序。
因此,我创建了一个工厂解析器并进行了注册。
public class FactoryResolver : IDbProviderFactoryResolver
{
public DbProviderFactory ResolveProviderFactory(DbConnection connection)
{
if (connection.GetType() == typeof(SQLiteConnection))
{
return SQLiteFactory.Instance;
}
if (connection.GetType() == typeof(EntityConnection))
{
return SQLiteProviderFactory.Instance;
}
return null;
}
}
并添加:
SetProviderFactoryResolver(new FactoryResolver());
但是现在我得到了这个错误:
找不到名称为'System.Data.SQLite.EF6'的ADO.NET提供程序的Entity Framework提供程序。请确保在应用程序配置文件的“entityFramework”部分中注册了提供程序。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkId=260882。
我已经花了两天时间在这个问题上了,现在已经没有任何想法了。
DbConfiguration
类(例如,你在发布的代码中使用的那个类)和解析器 - 只有答案中提到的类。还要确保你使用的是带有连接字符串的构造函数,而不是连接。正如你所见,上述的IDbDependencyResolver
会强制解析DbProviderFactory
,因此不应该出现这样的错误。 - Ivan StoevDefaultDbProviderFactoryResolver
,而你的使用的是Net40DefaultDbProviderFactoryResolver
,它们似乎使用了不同的代码路径 - 前者仅使用connection.ProviderFactory
,而后者则使用配置文件 :( - Ivan Stoev