Entity Framework 6与SQLite 3 Code First - 不会创建表

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会重新创建数据库,但不会创建表格,当程序尝试读取数据时,会出现错误消息表格不存在。

有人成功地使用EF6实现了Code First吗?我现在完全陷入困境,希望能得到帮助/指导!!!

谢谢大家。


2
更新于3月24日:仍然没有进展,刚刚下载了最新版本的SQLite(1.0.92)和EF6(6.0.0),但仍然没有成功。尝试了EF 6.0.2和6.1.0,都没有起作用。有什么建议可以解决这个问题吗?救命啊!! - user1192887
2个回答

62

编辑(2021年12月8日)

本文/库针对的是EF 6而非EF Core。 如果您使用EF Core,支持SQLite的Code First。


初始版(2015年4月5日)

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

如果您遇到任何问题或需要某个功能,请随时在GitHub上提交新问题。当然,PR非常受欢迎。

编辑(2016年4月26日):

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

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

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

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

  • 唯一性约束(使用UniqueAttribute装饰列,这是本库的一部分)
  • 排序规则约束(使用CollateAttribute装饰列,这是本库的一部分)

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

  1. 利用DbInitializers:
  • SqliteCreateDatabaseIfNotExists
  • SqliteDropCreateDatabaseAlways
  • SqliteDropCreateDatabaseWhenModelChanges
  • 使用以下两个类之一可以获得更多控制:
    • SqliteSqlGenerator(基于EdmModel创建SQL)
    • SqliteDatabaseCreator(基于Database和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)

46

遗憾的是,System.Data.SQLite.EF6中的EF6提供程序实现不支持创建表格。我下载SQLite源代码查看,但未找到创建表格和迁移的任何内容。EF6提供程序基本上与它们的Linq实现相同,因此它都旨在查询数据库而不是修改它。

我目前使用SQL Server进行所有工作,并使用SQL Server Compact & SQLite Toolbox生成针对SQLite的SQL脚本。然后可以使用SQLiteCommand运行这些脚本以模拟迁移。

更新

EF7中,不再支持SQL Server Compact,并且EF团队正在开发一个新的SQLite提供程序。该提供程序将使用微软的托管SQLite包装器项目Microsoft.Data.SQLite而不是System.Data.SQLite项目。这也将允许在iOS、Android、Windows Phone/Mobile、Linux、Mac等系统上使用EF7,因为Microsoft的包装器正在被开发为可移植库。

它仍处于测试版阶段,但如果您想要查看,则可以从MyGet的ASP.Net开发源(devmasterrelease)获取NuGet包。请搜索EntityFramework.SQLite包。


1
据我所知,EF7支持SqlServerCompact。请参考以下链接:https://github.com/ErikEJ/EntityFramework7.SqlServerCompact/wiki/Using-EF7-with-SQL-Server-Compact-in-Traditional-.NET-Applications - Mauro Sampietro
@sam 在 EF7 中支持任何第三方数据库,只要有人编写了提供程序。这就是 ErikEJ 所做的。它不是官方 EF7 代码库的一部分,因此不受 EF7 团队 / Microsoft 支持。 - kjbartel

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