.net - Entity Framework 6 with SQLite 3 Code First - 不会创建表

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

使用来自 NuGet 的最新版本的 EF6 和 SQLite。在 Stackoverflow 上发表了一些有用的帖子之后,我终于让 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 一起工作?感谢您提供帮助/指导,因为我现在完全被困住了!!!

谢谢大家。

最佳答案

编辑 (12.08.2021)

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


初始(05.04.2015)

我从 fried 的代码开始,并创建了一个项目,让您可以使用 CodeFirst。该项目可在 GitHub 上开源或 NuGet Package .

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

编辑(26.04.2016):

同时我在这个项目中做了很多。

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

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

还有一些SQLite独有的特性,默认是不支持的:

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

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

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

编辑(2020 年 5 月 30 日和 2021 年 3 月 20 日): 由于 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)

关于.net - Entity Framework 6 with SQLite 3 Code First - 不会创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22174212/

相关文章:

c# - 此关系的哪一部分 WillCascadeOnDelete(true)?

.net - 使用 dotnet core 登录 FluentD?

Sqlite:基于非主键字段创建具有重复行的表

c# - 从 EF Code First 迁移中删除表

linux - docker 显示没有释放 SQLite 数据库的内存

android - SQLite 绑定(bind)参数 - 它们仅限于 WHERE 子句吗?

c# - Fluent API HasXXX 与 WithXXX 方法

javascript - 将一个 div 拖放到另一个 div 中

c# - 启动时动态决定Winforms还是Wpf?

.net - 在矩形中换行,同时允许截断单词