【问题标题】:Entity Framework 6 with SQLite 3 Code First - Won't create tablesEntity Framework 6 with SQLite 3 Code First - 不会创建表
【发布时间】:2014-04-06 02:54:49
【问题描述】:

使用来自 NuGet 的最新版本的 EF6 和 SQLite。在 Stackoverflow 上发表了一些有用的帖子后,我终于让 app.config 文件工作了。现在的问题是,虽然数据库已经创建,但表并没有被创建。

我的 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>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite"
                type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <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>
  <connectionStrings>
    <add name="MyDBContext"
          connectionString="Data Source=|DataDirectory|MyDB.sqlite"
          providerName="System.Data.SQLite" />
  </connectionStrings>
</configuration>

我的简单测试程序:

class Program
{
    static void Main(string[] args)
    {
        using (var db = new MyDBContext())
        {
            db.Notes.Add(new Note { Text = "Hello, world" });
            db.Notes.Add(new Note { Text = "A second note" });
            db.Notes.Add(new Note { Text = "F Sharp" });
            db.SaveChanges();
        }

        using (var db = new MyDBContext())
        {
            foreach (var note in db.Notes)
            {
                Console.WriteLine("Note {0} = {1}", note.NoteId, note.Text);
            }
        }

        Console.Write("Press any key . . . ");
        Console.ReadKey();
    }

    public class Note
    {
        public long NoteId { get; set; }
        public string Text { get; set; }
    }

    public class MyDBContext : DbContext
    {
        // default constructor should do this automatically but fails in this case
        public MyDBContext()
            : base("MyDBContext")
        {

        }
        public DbSet<Note> Notes { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

如果我手动创建表,程序运行正常并且表会更新。如果我删除数据库,EF 会创建它但不创建表,并且程序在尝试读回数据时失败,并显示表不存在的错误消息。

有没有人设法让 Code First 与 EF6 一起工作?非常感谢您的帮助/指导,因为我现在完全陷入困境了!!!

谢谢大家。

【问题讨论】:

  • 3 月 24 日更新:仍然没有任何进展,刚刚下载了最新版本的 SQLite (1.0.92) 和 EF6 (6.0.0) 仍然没有成功。试过 EF 6.0.2 和 6.1.0 都没有用。任何建议如何解决这个问题?救命!!

标签: .net sqlite ef-code-first entity-framework-6 system.data.sqlite


【解决方案1】:

编辑 (12.08.2021)

这篇文章/lib 是关于 EF 6 而不是 EF Core。 如果您使用 EF Core,则支持 SQLite 代码优先。


初始 (05.04.2015)

我从 Fried 的代码开始,并创建了一个让您使用 CodeFirst 的项目。该项目在GitHubNuGet Package 上开源。

如果您遇到任何问题或错过某个功能,请随时打开new issue on GitHub。当然,非常欢迎 PR。

编辑(26.04.2016):

与此同时,我在这个项目中做了很多工作。

支持以下(默认 EF)功能:

  • 类中的表(支持的注释:表)
  • 属性中的列(支持的注释:Column、Key、MaxLength、Required、NotMapped、DatabaseGenerated、Index)
  • PrimaryKey 约束(键注释,支持键组合)
  • 外键约束(1-n 关系,支持“删除时级联”)
  • 非空约束
  • 自动递增(int PrimaryKey 将自动递增)
  • 索引(使用 Index 属性装饰列。默认情况下会自动为外键创建索引。为防止这种情况,您可以删除对流 ForeignKeyIndexConvention)

还有一些 SQLite 独有的功能,默认不支持:

  • 唯一约束(使用 UniqueAttribute 装饰列,这是该库的一部分)
  • 整理约束(使用 Collat​​eAttribute 装饰列,这是该库的一部分)

有两种方法可以使用这个库的功能。

  1. 利用 DbInitializers:
  • SqliteCreateDatabaseIfNotExists
  • SqliteDropCreateDatabaseAlways
  • SqliteDropCreateDatabaseWhenModelChanges
  1. 使用以下两个类之一获得更多控制:
  • SqliteSqlGenerator(基于 EdmModel 创建 SQL)
  • SqliteDatabaseCreator(基于 Database 和 DbModel 创建新的 SQLite 数据库)

编辑(30.05.2020 和 20.03.2021): 由于 EF 6 现在支持 .NET Core 3 及更高版本,我调整了库以支持 .NET Standard 2.1。支持以下 .NET 框架版本:

  • .NET 4.0(使用 net40)
  • .NET 4.5-4.8(使用 net45)
  • .NET Core 3.0-3.1(使用 netstandard2.1)
  • .NET 5(使用 netstandard2.1)

【讨论】:

  • 你先生,真棒!我花了很长时间试图让 SQLite 和 EF6 工作,却发现它不会创建数据库。这让我很开心:) 也谢谢@fried!
  • 在生产中使用它并且效果很好。太棒了。
  • 这是否适用于基于 PCL / Xamarin 的项目?我尝试将包添加到 PCL,但它抱怨 DataAnnotations。如果可以的话,很想在那里使用它。
  • 非常好!但不幸的是,不支持迁移。还是谢谢。
  • 这是一个了不起的解决方案。谢谢!
【解决方案2】:

很遗憾,System.Data.SQLite.EF6 中的 EF6 提供程序实现不支持创建表。我下载了 SQLite 源代码进行查看,但找不到用于创建表和迁移的任何内容。 EF6 提供者与他们的 Linq 实现基本相同,所以它的目的都是查询数据库而不是修改它。

我目前使用 SQL Server 完成所有工作,并使用 SQL Server Compact & SQLite Toolbox 为 SQLite 生成 sql 脚本。然后可以使用SQLiteCommand 运行脚本来模拟迁移。

更新

EF7 中,对 SQL server compact 的支持已被删除,EF 团队正在开发一个新的 SQLite 提供程序。提供程序将使用 Microsoft 的托管 SQLite 包装项目 Microsoft.Data.SQLite 而不是 System.Data.SQLite 项目。这也将允许在 iOS、Android、Windows Phone/Mobile、Linux、Mac 等上使用 EF7,因为 Microsoft 的包装器正在开发为可移植库。

它仍处于测试阶段,但如果您想看看,可以从 MyGet(devmasterrelease)的 ASP.Net 开发提要中获取 nuget 包。寻找EntityFramework.SQLite 包。

【讨论】:

  • 是的,我走了同样的路。我现在正在将应用程序移至根本不支持 EF 的 Windows 8.1 商店应用程序!!!唤醒 MS,我们真的需要对 Windows Store 应用程序提供适当的 ORM 支持,即使它仅适用于 SQLite。必须执行 EF 提供的所有更改跟踪和事务支持,这真的很痛苦。
  • @user1192887 我完全同意。我有完全相同的问题。您对使用 sql compact 4.0 代替 SQLite 有何看法?
  • 我受够了并编写了自己的初始化程序,请在下面查看我的答案!
  • @user1192887 阅读我的更新。 MS 显然已经“醒来”,因为他们一直在从头开始开发 EF7,它将在 Windows 应用商店中与 SQLite 一起使用。
  • 在我看来,EF7 中支持 SqlServerCompact github.com/ErikEJ/EntityFramework7.SqlServerCompact/wiki/…
【解决方案3】:

我决定编写自己的基本数据库初始化程序来解决这个问题。

您可以在这里查看: https://gist.github.com/flaub/1968486e1b3f2b9fddaf

它支持:

  • 多对多关系
  • Code-First 数据注释,例如:
    • [键]
    • [必填]
    • [索引]
    • [外键]

【讨论】:

    【解决方案4】:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多