web-dev-qa-db-ja.com

方法:エンティティフレームワークとコードファーストを備えた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>

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

DbContext:

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

そして最後にmain()で

Database.SetInitializer( new PageDbInitializer() );

いくつかのステップが欠けていると思いますが、見つけることができません。

22
Pierluc SS

System.Data.SQLiteは、現在のバージョンではEFv1互換プロバイダーのみです( 12 )。これは、データベースの作成と削除を含むEFv4(EFv4.2はEFv4のラッパー)機能がないことを意味します(.NET3.5と.NET4.0のDbProviderServicesの違いを確認してください [〜#〜] msdn [〜#〜] )。そのため、SQLiteを使用する場合、最初にコードでデータベースの自動作成を使用することはできません。データベースとすべてのテーブルを手動で作成する必要があります。

別の方法として、SQLiteに別のプロバイダーを使用できます。たとえば DevartのSQLiteが提供 rは、EFv4と4.1をサポートしているため、データベースの作成をサポートしていると主張しています。

24
Ladislav Mrnka

これをチェックしてください:

https://github.com/msallin/SQLiteCodeFirst

NuGet としても利用可能

SqliteCreateDatabaseIfNotExistsなどのDBイニシャライザーをプロジェクトに追加します

Webサイトの例を次に示します。

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