在实体框架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=&quot;data source=mypath'dbname.db&quot;"
 providerName="System.Data.EntityClient" />

在实体框架6.1中使用SQLite 1.0.92的问题

你确定你的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程序集的引用。

你提供了一个不正确的引用到SqlServer而不是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"