在实体框架6.1中使用SQLite 1.0.92的问题
本文关键字:SQLite 问题 实体 框架 | 更新日期: 2023-09-27 18:02:43
我试图使用实体框架与SQLite数据库文件,但不能使其工作。
我使用的是Visual Studio 2012, SQLite 1.0.92和Entity Framework 6.1。
edmx图正确地显示了我的表,所以我猜映射工作,但是当我尝试做:
_Context = new DataContext();
var test = _Context.Set<T>().ToList();
我得到以下异常:
没有为ADO找到实体框架提供程序。. NET提供程序具有不变名称'System.Data.SQLite'。确保在应用程序配置文件的"entityFramework"部分中注册了提供程序。详见http://go.microsoft.com/fwlink/?LinkId=260882
根据其他SO帖子的建议,我尝试在我的DbContext构造函数中添加这一点,以确保dll被复制:
var ensureDLLIsCopied = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
结果是,我的程序没有抛出异常,而是永远挂起。
我也试着按照这里的建议和这篇文章中接受的答案来改变app.config文件,但是没有改变。
任何想法?
谢谢
我改变了我的DbContext:
public class DataContext : DbContext { }
to this:
public class DataContext : DbContext
{
public DataContext() : base("name=Entities") { }
}
现在,我得到的异常是:在应用程序配置文件中找不到"实体"连接字符串
但是'Entities'连接字符串是在app.config:
<add name="Entities"
connectionString="metadata=res://*/Entities.Model.csdl|res://*/Entities.Model.ssdl|res://*/Entities.Model.msl;provider=System.Data.SQLite;provider connection string="data source=mypath'dbname.db""
providerName="System.Data.EntityClient" />
你确定你的app.config设置正确吗?我使用EF6.1与System.Data.SQLite v1.0.92.0使用以下app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<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" />
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".Net Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
<entityFramework>
<providers>
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
</configuration>
这需要在执行程序的app.config中,而不是在包含DbContext的程序集的app.config中。或者,您可以使用基于代码的配置,就像我在这里回答的那样,您可以将其放置在与DbContext相同的程序集中。
如果你的DbContext是在一个不同的程序集,那么该程序集将需要一些引用SQLite的代码,否则编译器将不包括对所需SQLite程序集的引用。
如果您使用的是System.Data.SQLite v1.0.92.0
替换Web.config中的旧代码片段:
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.SQLiteProviderServices, System.Data.SQLite.Linq"/>
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
代替:
<entityFramework>
<providers>
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
</providers>
这对我有用。区别在于"invariantName",去掉"EF6"