C# 如何:首先使用EntityFramework和代码的SQLite

C# 如何:首先使用EntityFramework和代码的SQLite,c#,entity-framework,sqlite,ef-code-first,system.data.sqlite,C#,Entity Framework,Sqlite,Ef Code First,System.data.sqlite,我正在尝试使用EF动态创建一个嵌入式SQLite数据库,但是,我无法让它工作,数据库文件从未创建过 我有EF4.2和最新版本的SQLite 这是我的 app.config <?xml version="1.0"?> <configuration> <system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite"/> &

我正在尝试使用EF动态创建一个嵌入式SQLite数据库,但是,我无法让它工作,数据库文件从未创建过

我有EF4.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>

我相信我缺少了一些步骤,但无法找到它们。

System.Data.SQLite
是当前版本中唯一与EFv1兼容的提供程序(,)。这意味着它没有EFv4(EFv4.2是EFv4的包装器)功能,包括数据库的创建和删除(请检查中.NET 3.5和.NET 4.0的差异)。因此,在使用SQLite时,不能首先使用代码自动创建数据库。必须手动创建数据库和所有表

您也可以为SQLite使用不同的提供程序。例如,r声称它支持EFv4和4.1,从而支持数据库创建。

请查看以下内容:

也可作为

它将一些DB初始值设定项添加到pObject中,例如
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);
    }
}
公共类MyDbContext:DbContext
{
公共MyDbContext()
:base(“ConnectionStringName”){}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
var sqliteConnectionInitializer=新的SqliteCreateDatabaseIfNotExists(
Database.Connection.ConnectionString,modelBuilder);
SetInitializer(sqliteConnectionInitializer);
}
}

出于好奇,你最终做了什么?您是否使用了devart提供程序或找到了其他解决方案?@StellaMusik我最终暂时使用了SQLExpress,但您始终可以先使用模型或数据库SQLlite@PierlucSS面对同样的问题。我不想使用Devart的,所以很明显它将是第一个模型,因为这是一篇老文章,你知道这是否仍然是一个有效的答案吗?我目前正试图找到有关这方面的信息,在我的研究进展中,这似乎仍然成立(但我不确定),我可以验证我甚至仍然无法使用当前的sqlite提供程序创建数据库。@user3141326:您可以尝试EF Core(又称EF 7)吗?它应该有SQLite的内置提供程序。工作正常。但是,当前版本(1.5.1.25)不需要将连接字符串传递到SqliteCreateDatabaseIfNotExists构造函数,只需要模型生成器。
class PageDB : DbContext
{
        public DbSet<WebPage> Pages { get; set; }
}
Database.SetInitializer( new PageDbInitializer() );
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);
    }
}