HOWTO:带有实体框架和代码优先的SQLite

ndh0cuux  于 2023-02-05  发布在  SQLite
关注(0)|答案(2)|浏览(445)

我试图创建一个嵌入式SQLite数据库的飞行与EF然而,我不能让它工作,数据库文件是从来没有得到创建。
我有EF 4.2和最新版本SQLite
这是我所拥有的

    • 应用程序配置**
<?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>
    • DB初始值设定项(放入一些内容)**
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);
    }
}
    • 数据库上下文:**
class PageDB : DbContext
{
        public DbSet<WebPage> Pages { get; set; }
}

最后在主()

Database.SetInitializer( new PageDbInitializer() );

我想我少了一些步骤,但找不出来。

falq053o

falq053o1#

System.Data.SQLite仅在当前版本中为EFv1兼容提供程序(12)。这意味着它没有EFv4(EFv4.2是EFv4的 Package 器)功能,包括数据库创建和删除(检查MSDN中.NET 3.5和.NET 4.0的DbProviderServices差异)。因此,在使用SQLite时,不能先使用代码自动创建数据库。必须手动创建数据库和所有表。
作为一种选择,你可以使用不同的SQLite提供程序。例如Devart's SQLite provide r声称它支持EFv4和4.1,因此支持数据库创建。

odopli94

odopli942#

看看这个:
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);
    }
}

相关问题