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