如何使用EntityFramework和Code-First连接SQLite数据库

24

我正在尝试使用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>

数据库初始化程序(用于添加一些内容)

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

DbContext:

class PageDB : DbContext
{
        public DbSet<WebPage> Pages { get; set; }
}

最后,在main()函数中

Database.SetInitializer( new PageDbInitializer() );

我认为我缺少了一些步骤,但是找不出来。


只是出于好奇,你最终做了什么?你使用了Devart提供的驱动程序还是找到了其他解决方案? - Justin Dalrymple
@StellaMusik 我最终使用了SQLExpress,但你也可以随时使用model或database first与SQLlite。 - Pierluc SS
@PierlucSS 面临相同的问题。我不想使用Devart,所以显然它将是模型优先。 - Haikal Nashuha
2个回答

25

System.Data.SQLite 是一个目前仅支持 EFv1 的提供程序(1, 2),这意味着它不具备 EFv4 (EFv4.2 是 EFv4 的一个包装器) 的功能,包括数据库的创建和删除 (在 MSDN 中查看 .NET 3.5 和 .NET 4.0 的 DbProviderServices 差异)。因此,在使用 SQLite 进行代码优先时,您无法使用自动数据库创建功能,必须手动创建数据库和所有表。

作为替代方案,您可以使用其他 SQLite 提供程序。例如,Devart's SQLite provider 声称支持 EFv4 和 4.1,从而支持数据库创建。


21
因为这是一个旧帖子,你知道这个答案是否仍然有效吗?我目前正在寻找相关信息,在我的研究进展中,似乎这仍然是正确的(但我不确定)。 - default
我可以确认,即使使用当前的sqlite提供程序,我仍然无法创建数据库。 - user3141326
@user3141326:你可以尝试一下EF Core(又名EF 7)吗?它应该内置了SQLite的提供程序。 - Ladislav Mrnka

15

看这个:

https://github.com/msallin/SQLiteCodeFirst

还可以作为NuGet使用

它会向您的项目添加一些 DB 初始化程序,例如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);
    }
}

2
运行良好。当前版本(1.5.1.25)不需要将连接字符串传递给SqliteCreateDatabaseIfNotExists构造函数,只需要模型生成器即可。 - Mark Feldman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接