HOWTO:带有EntityFramework和Code-First的SQLite

Pie*_* SS 22 c# sqlite entity-framework system.data.sqlite ef-code-first

我正在尝试使用EF动态创建嵌入式SQLite数据库但是,我无法使其工作,数据库文件永远不会被创建.

我有EF 4.2和最新版本的SQLite

这就是我所拥有的

的app.config

<?xml version="1.0"?>
<configuration>
  <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"/>
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="DataContext"
         connectionString="Data Source=test.db;Version=3;New=True;"
         providerName="System.Data.SQLite" />
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)

数据库初始化程序(放入一些内容)

class PageDbInitializer : DropCreateDatabaseAlways<PageDB>
{
    protected override void Seed(PageDB context)
    {
        for (int i = 0; i < 10; i++)
        {
            WebPage page = new WebPage() { Name = "Page" + (i + 1) };
            context.Pages.Add(page);
        }
        base.Seed(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

的DbContext:

class PageDB : DbContext
{
        public DbSet<WebPage> Pages { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

最后在主()

Database.SetInitializer( new PageDbInitializer() );
Run Code Online (Sandbox Code Playgroud)

我相信我有一些步骤缺失,但无法找到它们.

Lad*_*nka 24

System.Data.SQLite在当前的版本仅EFv1兼容提供商(1,2).这意味着它没有EFv4(EFv4.2是EFv4的包装)功能,包括数据库创建和删除(检查MSDN中DbProviderServices .NET 3.5和.NET 4.0的差异).因此,在使用SQLite时,您无法首先使用代码自动创建数据库.您必须手动创建数据库和所有表.

作为替代方案,您可以为SQLite使用不同的提供程序.例如,Devart的SQLite提供 r声明,它支持EFv4和4.1,从而支持数据库创建.

  • 由于这是一篇旧帖子,你知道这仍然是一个有效的答案吗?我目前正在尝试找到有关此问题的信息,在我的研究进展中,看起来这似乎仍然适用(但我不确定) (21认同)

Jer*_*her 13

看一下这个:

https://github.com/msallin/SQLiteCodeFirst

也可以作为NuGet使用

它会为您的对象添加一些数据库初始化程序,例如 SqliteCreateDatabaseIfNotExists

以下是该网站的示例:

public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("ConnectionStringName") { }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyDbContext>(
            Database.Connection.ConnectionString, modelBuilder);
        Database.SetInitializer(sqliteConnectionInitializer);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 工作正常。当前版本 (1.5.1.25) 不需要将连接字符串传递到 SqliteCreateDatabaseIfNotExists 构造函数中,只需要模型生成器。 (2认同)