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来装饰列,这是该库的一部分)
- 整理约束(使用CollateAttribute装饰列,这是该库的一部分)
有两种方法可以使用这个库的function。
-
使用DbInitializers:
- SqliteCreateDatabaseIfNotExists
- SqliteDropCreateDatabaseAlways
- SqliteDropCreateDatabaseWhenModelChanges
-
使用以下两个类中的一个来获得更多的控制权:
- 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-和最存储库的图案/