【发布时间】:2017-04-25 16:13:26
【问题描述】:
我正在尝试为无法更改 App.config 的应用程序制作一个使用 EF6.1 和 SQLite 的插件,因此需要在代码中设置所有配置和连接字符串。
我发现这个答案看起来很有希望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,因为它给了我:
不支持关键字:“版本”。
如果我删除它,我会收到一个错误,指出它无法连接并且它显然正在尝试连接到 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 提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分注册。请参阅http://go.microsoft.com/fwlink/?LinkId=260882 了解更多信息。
我已经在这方面做了两天了,但我的想法已经不多了。
【问题讨论】:
标签: c# sqlite entity-framework-6