使用System.Data.SQLite和Entity Framework 6的简单示例

我正在尝试使用SQLite和EF6在控制台应用程序中使用简单的代码第一个示例,但是我遇到了多个错误:我在VS 2015中创建了一个新的控制台项目。然后安装EF(6.1.3)和System。 Data.SQLite(1.0.102)通过NuGet。

尝试运行一个简单的程序:

namespace SQLiteConsole1 { class Person { public int Id { get; set; } public string Name { get; set; } } class MyContext : DbContext { public DbSet Persons { get; set; } } class Program { static void Main(string[] args) { using (var db = new MyContext()) { var person = new Person() { Name = "John" }; db.Persons.Add(person); db.SaveChanges(); } } } } 

这就是我的App.Config看起来像这样:

                  

当我第一次运行此程序时,我收到以下错误:

“未处理的exception:System.InvalidOperationException:找不到具有不变名称’System.Data.SQLite’的ADO.NET提供程序的entity framework提供程序。确保提供程序已在应用程序配置文件的’entityFramework’部分中注册。”

所以我将<provider invariantName="System.Data.SQLite.EF6"更改为<provider invariantName="System.Data.SQLite" ,然后我收到此错误:

未处理的exception:System.Data.Entity.Infrastructure.DbUpdateException:更新条目时发生错误。 有关详细信息,请参阅内部exception System.Data.Entity.Core.UpdateException:更新条目时发生错误。 有关详细信息,请参阅内部exception System.Data.SQLite.SQLiteException:SQL逻辑错误或缺少数据库没有这样的表:People

需要改变什么来使这个简单的例子有效?

这里提出了一个类似的问题: entity framework6与SQLite 3代码优先 – 不会创建表

kjbartel提供了非常有用的解释,即EF SQLite驱动程序不支持表创建。

另请参阅https://github.com/msallin/SQLiteCodeFirst ,它提供了一个出色的解决方案。 我安装了SQLite.CodeFirst NuGet包,并添加了以下代码,然后该应用程序正常工作:

  class MyContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists(modelBuilder); Database.SetInitializer(sqliteConnectionInitializer); } public DbSet Persons { get; set; } } 

您需要使用模型的表初始化数据库。 注意错误“SQL逻辑错误或缺少数据库没有这样的表:People”。

这意味着您需要运行SQL来在数据库中创建相应的表,幸运的是,如果在模型编辑器(* .edmx文件)中使用VS,在上下文菜单下,有一个选项可以让它自动生成SQL并执行它以根据模型为您在数据库中创建表条目。 注意:有时为非MS-SQL自动生成的问题可能需要在编译/运行之前手动修复。