使用System.Data.SQLite 1.0.93创建Entity Framework 6.1.1模型的数据库优先。

22
我有一个项目,刚刚使用NuGet进行了更新。这个更新将实体框架从6.1更新到了6.1.1,并将SQLite更新到了1.0.93。我想要从最新的数据库更新我的模型。我按以下步骤操作:
1. 模型从数据库生成 2. 选择SQLite数据库 3. 生成
在生成后,我收到了下面显示的错误消息。我安装了1.0.93设计时组件。有人知道是什么原因引起了这个错误吗?项目引用和版本都与上面显示的版本相匹配。
错误消息:
您的项目引用了最新的Entity Framework;但是没有找到与此版本兼容的Entity Framework数据库提供程序来连接数据。
更新:
我最终使用包管理器控制台手动安装了6.1.0。
Install-Package EntityFramework -Version 6.1.0
然后在我的csproj文件中将 packages\EntityFramework.6.1.1
替换为 packages\EntityFramework.6.1.0
我尝试从数据库创建EF Designer和Code First,但仍然遇到同样的错误。
更新:
我已经按照Tom提供的说明操作了,感谢他花费时间详细回复,我很感激。但是我无法让实体框架设计器与SQLite 1.0.93一起工作。我发现:
1) 当我像Tom描述的那样从工具菜单添加SQLite数据源时,我会看到SQLite数据提供程序。
2) 但是当我重新启动Visual Studio时,数据源并未连接。
3) 数据源可以刷新,在重新启动后它是有效的。
4) 添加新的数据项,但SQLite没有列在提供程序中。
我已经双重检查了注册表和EF6被附加到不变名称上,SQLite dll已在GAC中注册。我将尝试查找其他可能性,但目前我不知道该查找什么。顺便说一句,我已经尝试过dotConnect,但它也不能与EF 6.1.1一起工作。
更新2:
有人知道Entity Framework Designer是否有记录选项以找出可能发生的情况吗?

好问题,兄弟,我也有同样的问题。 - r.hamd
6个回答

18

[ 更新:如果需要更简单的解决方案,适用于Visual Studio 2013 Update 4(专业版和旗舰版)以及最近版本的Sqlite提供程序和EF,请查看下面“broslav”发布的解决方案。不知道它是否适用于Express版本... ]

好的,这是一个建议。这对于Visual Studio Express版本不起作用。 而且,我不确定如何使其适用于现有项目的更新。 这真是一件非常麻烦的事情。 我没有测试是否需要所有步骤,但是应该可以使用以下步骤:

首先,不要使用SQLite的NuGet包,而是从这里下载程序集安装程序: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

安装32位Windows (.NET Framework 4.5.1)的Setups安装程序:sqlite-netFx451-setup-bundle-x86-2013-1.0.93.0.exe(10.00 MiB)(不是64位版本)。只有这个版本带有设计器。

安装并选择在GAC中安装并安装VS13的设计器。

以下步骤的确切顺序很重要!

我制作了一个这些步骤的视频,请参见:http://vimeo.com/103372740

在VS13中创建一个项目。将生成目标定位到4.5.1框架和显式的x86。保存并构建。

接下来,从NuGet安装最新的EF 6包(6.1.1)。保存并构建。

手动添加对已安装SQLite程序集的引用(包括设计器),在引用管理器下可以找到扩展选项,以选择GAC中添加的四个程序集:System.Data.SQLite Core + Designer + for Entity Framework + for LINQ..保存并构建。

然后在工具下的Connect to Database中通过创建连接到数据库。在做任何其他操作之前,请先保存和构建,然后重新启动Visual Studio。在开始ADO.NET实体数据模型向导之前,不要做任何其他事情,因此不要刷新数据库连接。

添加ADO.NET实体数据模型,选择从数据库生成。您的数据库连接将显示在下拉列表中。保留它,但是仍然选择创建一个新的连接,并选择完全相同的数据库(就像您正在创建新的连接一样)。听起来很傻,但是这是至关重要的,请参见下面的图像...

Connect Entity Model

当我按照这种方式添加ADO.NET实体数据模型时,它确实出现了恼人的错误,但是下一步按钮是可选的,一切都可以正常运行(令人惊讶)!

设计器可以使用,检索数据和编写数据也可以使用。

尚未在另一台机器上测试部署...我正在使用Win7 64位。

更改更新:在完成所有上述操作之后,必须从NuGet安装System.Data.SQLite.EF6包,然后将以下内容添加到App.Config中并删除其他提供程序以及删除<system.data></system.data>之间的所有内容,否则您将收到一些异常。但请注意,这意味着每次要更新EDMX模型时,都必须将App.Config invariantName="System.Data.SQLite"更改为invariantName="System.Data.SQLite.EF6",反之亦然。

** 这变得荒谬了吗?是的,是的!这让我非常头痛... **


我不熟悉通过扩展添加引用。这是什么意思?我已经通过项目添加了太多次的引用,数不清了。 - dgxhubbard
我使用注册表和gac修复程序构建了带有Entity Framework 6.1.1的sqlite 1.0.94版本。现在我正在运行Entity Framework 6.1.1,并安装了sqlite 1.0.93版本(在重新安装Windows、Visual Studio 2013等之后)。整个问题变得棘手起来。 - dgxhubbard
工作得非常完美!感谢您的指导。 - Frank
我尝试了相同的步骤,但仍然无法解决问题......数据源仍未显示在实体模型向导中。请帮忙...我已经卡在这里两天了.. - Neha
有没有命令行工具可以生成实体,而不是使用VS GUI? - Lei Yang
显示剩余6条评论

11

这是对我有效的方法:

所以我的相关软件包如下:

    <packages>
      <package id="EntityFramework" version="6.1.1" targetFramework="net451" />
      <package id="System.Data.SQLite" version="1.0.94.1" targetFramework="net451" />
      <package id="System.Data.SQLite.Core" version="1.0.94.0" targetFramework="net451" />
      <package id="System.Data.SQLite.EF6" version="1.0.94.0" targetFramework="net451" />
      <package id="System.Data.SQLite.Linq" version="1.0.94.1" targetFramework="net451" />
    </packages>

而对我起作用的 app.config 内容如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <system.diagnostics>
    <sources>
      <!-- This section defines the logging configuration for My.Application.Log -->
      <source name="DefaultSource" switchName="DefaultSwitch">
        <listeners>
          <add name="FileLog" />
          <!-- Uncomment the below section to write to the Application Event Log -->
          <!--<add name="EventLog"/>-->
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="DefaultSwitch" value="Information" />
    </switches>
    <sharedListeners>
      <add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter" />
      <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
      <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
    </sharedListeners>
  </system.diagnostics>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
  </startup>
  <system.data>
    <!--
        NOTE: The extra "remove" element below is to prevent the design-time
              support components within EF6 from selecting the legacy ADO.NET
              provider for SQLite (i.e. the one without any EF6 support).  It
              appears to only consider the first ADO.NET provider in the list
              within the resulting "app.config" or "web.config" file.
    -->
    <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>
  <connectionStrings>
    <add name="WorkinDataEntities" connectionString="metadata=res://*/WorkinDataModel.csdl|res://*/WorkinDataModel.ssdl|res://*/WorkinDataModel.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=X:\dev\proj\workin\bin\data.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

你可以看到,最终对我来说,不需要从invariantName中移除"EF6",也不需要移除或重新排列其他提供程序或默认连接工厂。我没有必要进行任何注册表修改。只需要重新排列启动项目的app.config中添加的add/remove标签(这些标签是在NuGet System.Data.SQLite 1.0.94.1包安装期间添加的),就可以取得不同的效果。

在完成以上步骤后,我通过NuGet更新了EntityFramework到6.1.2版本,使用设计器更新模型和在运行时访问数据仍然能够正常工作。


2
这是一个解决方案,我也在Win 64位上使用VisualStudio 2013 Pro Update 4和最新的Sqlite捆绑包(1.0.97)en EF进行了测试。(6.1.3)完美运行。而且更容易。谢谢broslav! - TomL
在尝试让新的实体模型看到连接字符串失败后,我只是复制了您的应用程序配置文件。哇,连接字符串出现了,实体模型也被填充了表格。这是使用SQLite 1.0.98.0和Visual Studio 2015。EF真是个噩梦。谢谢。现在需要尝试编写步骤,以便我知道如何使其工作。 - GeoffCoope

3
我终于有了一套步骤,可以将Sqlite和EF6添加到项目中:
EF6版本为6.0.0到6.1.3(目前最新版本)。 System.Data.Sqlite版本为1.0.93-1.0.95,但不能使用1.0.98(目前最新版本)。
为避免获取System.Data.Sqlite 1.0.98,请勿使用Nuget软件包管理器进行安装。请手动安装System.Data.Sqlite。不幸的是,http://system.data.sqlite.org/没有提供以前的下载列表。 x86 System.Data.Sqlite 1.093 x64 System.Data.Sqlite 1.093 我使用Nuget包管理器安装EF6,然后手动添加了System.Data.Sqlite库。我尝试多次使用1.0.98,但是无法成功。 App.config文件 对于我的实现,我正在使用数据库优先和手动编码的实体数据类。
 public partial class MyDbContextEF : DbContext
{
    public MyDbContext() : base("name=MyDbContext") { }

    public DbSet<DataRecord> DataRecords { get; set; }
}

[Table("TableName")]
public class DataRecord
{
    [Key]
    public Int64 RowID { get; set; }
    public string Name { get; set; }
}

我不知道那是版本问题还是重新卸载/安装所有东西的方法,但它起作用了!谢谢。 - dyesdyes

2
我遇到了完全相同的问题 - 模型设计器向导没有在下拉列表中显示我的sqlite数据库。我通过调整sqlite数据库连接和表来解决了这个问题。
0a) 我通过服务器资源管理器向我的sqlite文件添加了一个连接(服务器资源管理器中显示sqlite提供程序和服务器,但edmx模型向导中没有显示) 0b) 此时它仍未在edmx模型向导中显示,但在服务器资源管理器中显示为数据连接。 1) 我向sqlite文件添加了一个表。 2) 我通过服务器资源管理器关闭了与sqlite数据库的连接 3) 我通过服务器资源管理器打开了我的虚拟表的设计(从而重新初始化连接) 4) 我尝试“从数据库更新模型...”,它出现在下拉列表中
上面没有包括的另一步是我创建并删除了一个.mdf SQL服务器数据库新项目...>数据库服务...。我在尝试上述步骤之前做了这件事。我认为那没关系,但你永远不知道。
不确定是什么确切地起作用了。看看是否可以通过对连接和表进行微调来唤醒某些东西。

2

谢谢Erik。我一直在努力解决这个问题,但一直没有头绪。我查看了错误信息,并尝试了mistachkin为win 8.1更新1 64位设置的reg设置。可惜,我仍然遇到了同样的错误。但我知道这不是我的想象。 - dgxhubbard
我有一种感觉这个修复不会起作用,我会让SQLite的人知道。 - ErikEJ

1
我也遇到了这个问题。原因可能是我在安装system.data.sqlite驱动程序时忘记勾选visual studio复选框,然后在重新勾选复选框之前未卸载system.data.sqlite驱动程序并进行了覆盖安装。以下是解决方法:
  1. 卸载system.data.sqlite驱动程序。
  2. 重新启动电脑。
  3. 安装system.data.sqlite驱动程序。
  4. 删除旧的解决方案,并像以前一样设置新的解决方案(可能不是必要的)。
  5. 添加ADO.NET实体模型(我的模板丢失了,这个答案对我很有帮助)。
  6. 现在应该可以使用sqlite数据源了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接