【问题标题】:Database first create entity framework 6.1.1 model using system.data.sqlite 1.0.93数据库首先使用system.data.sqlite 1.0.93创建实体框架6.1.1模型
【发布时间】:2014-09-25 04:41:12
【问题描述】:

我有一个刚刚使用 nuget 更新的项目。此实体框架从 6.1 更新到 6.1.1,并将 sqlite 更新到 1.0.93。我想从我最新的数据库中更新我的模型。我做了以下步骤 1) 来自数据库的模型 2)选择sqlite数据库 3) 生成

生成后,我收到如下所示的以​​下错误消息。我安装了 1.0.93 设计时组件。有谁知道究竟是什么导致了这个错误。项目引用和版本都与上面显示的版本匹配。

错误信息:

您的项目引用了最新的实体框架;然而和实体框架数据库提供者 找不到与此版本兼容的数据连接。

更新:

我最终使用包管理器控制台手动安装了 6.1.0

Install-Package EntityFramework -Version 6.1.0

然后在我的csporj文件中替换

包\EntityFramework.6.1.1

包\EntityFramework.6.1.0

我尝试从数据库创建 EF 设计器并从数据库创建 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 sqlite


【解决方案1】:

我报告了这个问题并且正在修复,并且似乎有一个解决方法(我没有测试过)http://system.data.sqlite.org/index.html/tktview?name=e634e330a6

【讨论】:

  • 谢谢埃里克。我一直在用头撞墙试图弄清楚这一点。我查看了该错误并尝试了为 win 8.1 update 1 64 位设置的 reg 设置 misachkin。唉,我仍然得到同样的错误。但我知道这不是我的想象。
  • 我有一种感觉修复不起作用,我会让 sqlite 人知道
【解决方案2】:

[ 更新:要获得适用于 Visual Studio 2013 Update 4(Pro 和 Ultimate)以及最新版本的 Sqlite Providers 和 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) 的安装程序:sqlite-netFx451-setup-bundle-x86-2013-1.0.93.0.exe (10.00 MiB)(不是 64 位版本) .这是设计师唯一的一个。

安装并选择在GAC中安装并安装Designer for VS13。

对于以下内容,确切的顺序很重要!

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

在 VS13 中创建一个项目。将构建明确定位到框架 4.5.1 和 x86。保存并构建。

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

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

然后通过工具下的连接到数据库创建与数据库的连接。在您执行任何其他操作之前保存并构建,然后 重新启动 Visual Studio。在启动 ADO.NET 实体数据模型向导之前不要做任何其他事情,所以不要刷新数据库连接。

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

当我以这种方式实际添加 ADO.NET 实体数据模型时,它确实出现了烦人的错误,但“下一步”按钮是可选择的,并且 一切正常无论如何(令人惊讶)!

设计师工作,检索数据和写入数据工作。

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

更改更新:要获得正确的配置以实际访问数据库,您必须在执行 all 之后从 NuGet 安装 System.Data.SQLite.EF6 包以上,然后添加 <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> 到 App.Config 并删除其他提供程序并删除 <system.data></system.data> 之间的所有内容,否则您会遇到一些异常。但请注意,这意味着每次要更新 EDMX 模型时,都必须将 App.Config invariantName="System.Data.SQLite" 更改为 invariantName="System.Data.SQLite.EF6" ,反之亦然。

** 这越来越荒谬了?是的!这让我很头疼...... **

【讨论】:

  • 我不熟悉通过扩展添加引用。那是什么意思?我通过一个项目添加了太多次引用。
  • 我创建了一个小型控制台应用程序。我确保它以 x86 和 .net 4.5.1 为目标并构建。关闭视觉工作室并重新打开视觉工作室和项目。然后我添加 Database first 实体数据模型。 sqlite 数据库选择器立即出现,没有显示其他数据提供者选择对话框。我选择 sqlite 数据库并单击下一步。对话框消失并且没有生成任何内容。不知道发生了什么。我还添加了 Visual Studio 2013 更新 3。
  • 我使用 Entity Framework 6.1.1 构建了 sqlite 1.0.94,使用注册表和 gac 修复。现在我正在运行 Entity Framework 6.1.1 并安装了 sqlite 1.0.93(在重新安装 windows、visual studio 2013 等之后)。整个问题变得棘手。
  • 查看我对帖子的补充。希望它能澄清事情。
  • 如果您尝试这样做,请按照说明进行操作。如果我做点不一样的小事,那就不行了……所以别忘了先单独连接数据库,然后重启,再添加ADO.NET实体数据模型,然后再连接数据库中的向导。请参阅上面的详细信息。 (让我知道它是否适合你)
【解决方案3】:

我遇到了完全相同的问题——模型设计器向导没有在下拉列表中显示我的 sqlite db。我能够通过摆弄 sqlite db 连接和表来解决它。

0a) 我通过服务器资源管理器向我的 sqlite 文件添加了一个连接(sqlite 提供程序和服务器显示在服务器资源管理器的新连接向导中,但不是我的 edmx 模型向导) 0b)此时它还没有显示在 edmx 模型向导中,但在服务器资源管理器中显示为数据连接。 1)我在sqlite文件中添加了一个表。 2)我通过服务器资源管理器关闭了与 sqlite db 的连接 3)我通过服务器资源管理器打开了我的虚拟表的设计 om sqlite 文件(从而重新启动连接) 4)我尝试“从数据库更新模型......”它显示在下拉列表中

上面没有包括的另一个步骤是我创建并删除了一个 .mdf SQL 服务器数据库New Item... > Database Service...。我在尝试上述步骤之前不久就这样做了。我认为这无关紧要,但你永远不会知道。

不确定具体是做什么的。似乎通过服务器资源管理器手动断开连接并重新连接使VS“唤醒”并在列表中显示服务器。尝试摆弄一下连接和表,看看是否会唤醒某些东西。

【讨论】:

    【解决方案4】:

    我也有这个问题。原因可能是我在安装 system.data.sqlite 驱动程序时忘记勾选 Visual Studio 复选框,然后在没有先卸载 system.data.sqlite 驱动程序的情况下勾选复选框进行安装。我就是这样解决的:

    1. 卸载 system.data.sqlite 驱动程序。
    2. 重启。
    3. 安装system.data.sqlite驱动
    4. 删除旧解决方案并重新设置它,就像您所做的一样(可能没有必要)。
    5. 添加 ADO.NET 实体模型(我缺少模板,this answer helped with that
    6. 现在应该可以使用 sqlite 数据源了。

    【讨论】:

      【解决方案5】:

      这对我有用:

      所以我的包裹是:

          <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,通过设计器从数据库更新模型并在运行时访问数据仍然有效。

      【讨论】:

      • 这是一个解决方案,我还在 Win 64bit 上使用 VisualStudio 2013 Pro Update 4 和最新的 Sqlite 捆绑包 (1.0.97) en EF 进行了测试。 (6.1.3) 完美运行。而且也更容易。谢谢布罗斯拉夫!
      • 在未能获得新的实体模型来查看连接字符串后,我只是将您的应用配置复制到我的。 Viola,连接字符串出现,实体模型填充了表格。这是使用 SQLite 1.0.98.0 和 Visual Studio 2015。EF 真是一场噩梦。谢谢。需要尝试编写我现在如何工作的步骤哈。
      【解决方案6】:

      我终于有了将 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 File

      对于我的实现,我首先使用数据库手动编码实体数据类

       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; }
      }
      

      【讨论】:

      • 我不知道是那个版本还是只是再次卸载/安装所有的伎俩但它奏效了!谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多