entity framework6与SQLite 3代码优先 – 不会创build表

使用NuGet的最新版本的EF6和SQLite。 我终于得到了app.config文件后,在Stackoverflow上的一些有用的职位。 现在的问题是,虽然数据库是没有创build表。

我的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> 

我简单的testing程序:

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

如果我手动创build表,程序工作正常,表被更新。 如果我删除数据库,EF会创build它,但不会创build表,并且在程序试图读取带有表不存在的错误消息的数据时会失败。

有没有人设法使用EF6的Code First? 将感谢帮助/指导,因为我现在完全卡住了!

谢谢大家。

不幸的是, System.Data.SQLite.EF6中的EF6提供者实现不支持创build表。 我下载了SQLite源代码来看看,但找不到任何东西来创build表和迁移。 EF6的提供者基本上和他们的Linq实现一样,所以它的目的都是查询数据库而不是修改它。

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

更新

在EF7的支持下,SQL server compact已经被淘汰,一个新的SQLite提供者正在由EF团队开发。 该提供程序将使用Microsoft托pipe的SQLite包装项目Microsoft.Data.SQLite而不是System.Data.SQLite项目。 这也将允许在iOS,Android,Windows Phone / Mobile,Linux,Mac等上使用EF7,因为微软的包装正在被开发成一个便携式的库。

它仍然处于testing阶段,但是如果你想看,你可以从MyGet( dev , master , release )的ASP.Net开发源获得nuget包。 寻找EntityFramework.SQLite包。

我从油炸的代码开始,创build一个项目,让你使用CodeFirst。 该项目在GitHub上可用,或作为NuGet包使用 。

如果您遇到任何问题或错过某个function,请随时在GitHub上打开新的问题 。 当然PR是非常受欢迎的。

编辑(26.04.2016):

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

支持以下(默认EF)function:

  • 来自类的表(支持的注释:表)
  • 来自属性的列(支持的注释:Column,Key,MaxLength,Required,NotMapped,DatabaseGenerated,Index)
  • PrimaryKey约束(键注释,关键组合支持)
  • ForeignKey约束(1-n关系,支持'Cascade on delete')
  • 不是空约束
  • 自动递增(一个int PrimaryKey将自动递增)
  • 索引(使用索引属性装饰列索引是默认为外键自动创build的,为了防止这种情况,可以去掉ForeignKeyIndexConvention对话框)

还有一些SQLite独有的function,默认情况下不支持:

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

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

  1. 使用DbInitializers:

    • SqliteCreateDatabaseIfNotExists
    • SqliteDropCreateDatabaseAlways
    • SqliteDropCreateDatabaseWhenModelChanges
  2. 使用以下两个类中的一个来获得更多的控制权:

    • SqliteSqlGenerator(基于EdmModel创buildSQL)
    • SqliteDatabaseCreator(基于数据库和DbModel创build一个新的SQLite数据库)

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

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

它支持:

  • 多对多的关系
  • 代码优先的数据注释,如:
    • [键]
    • [需要]
    • [指数]
    • [ForeignKey的]

和你一样,我用compact4.0代替了sqlite。

作为参考http://hintdesk.com/sqlite-with-entity-framework-code-first-and-migration/ http://damienbod.wordpress.com/2013/11/18/using-sqlite-with-entity -framework -6-和最存储库的图案/