web-dev-qa-db-ja.com

Entity Framework 6でSystem.Data.SQLiteを使用した簡単な例

SQLiteとEF6を使用してコンソールアプリで動作する簡単なコードの最初の例を取得しようとしていますが、複数のエラーが発生しています。VS2015で新しいコンソールプロジェクトを作成しました。次にEF(6.1.3)とシステムをインストールします。 NuGetを介したData.SQLite(1.0.102)。

簡単なプログラムを実行してみてください。

namespace SQLiteConsole1
{
    class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    class MyContext : DbContext
    {
        public DbSet<Person> Persons { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new MyContext())
            {
                var person = new Person() { Name = "John" };
                db.Persons.Add(person);
                db.SaveChanges();
            }
        }
    }
}

これは私のApp.Configがこのように見えるものです:

  <connectionStrings>
    <add name="MyContext" connectionString="Data Source=C:\Temp\Test.sqlite" providerName="System.Data.SQLite" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
    <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>

このプログラムを初めて実行すると、次のエラーが表示されます。

未処理の例外:System.InvalidOperationException:不変名「System.Data.SQLite」を持つADO.NETプロバイダーのEntity Frameworkプロバイダーが見つかりません。プロバイダーがアプリケーション構成ファイルの「entityFramework」セクションに登録されていることを確認してください。」

<provider invariantName="System.Data.SQLite.EF6"<provider invariantName="System.Data.SQLite"に変更すると、次のエラーが表示されます。

未処理の例外:System.Data.Entity.Infrastructure.DbUpdateException:エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。 System.Data.Entity.Core.UpdateException:エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。 System.Data.SQLite.SQLiteException:SQLロジックエラーまたはデータベースがありません:そのようなテーブルはありません:People

この簡単な例を機能させるには、何を変更する必要がありますか?

28
RaelB

ここでも同様の質問があります: Entity Framework 6 with SQLite 3 Code First-Wo n't create tables

kjbartelは、テーブルの作成がEF SQLiteドライバーによってサポートされていないという非常に有用な説明を提供します。

https://github.com/msallin/SQLiteCodeFirst も参照してください。これは優れたソリューションを提供します。 SQLite.CodeFirst NuGetパッケージをインストールし、以下のコードを追加すると、アプリは正常に動作します。

    class MyContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyContext>(modelBuilder);
            Database.SetInitializer(sqliteConnectionInitializer);
        }
        public DbSet<Person> Persons { get; set; }
    }
30
RaelB

モデルのテーブルでデータベースを初期化する必要があります。エラー「SQLロジックエラーまたはそのようなテーブルのないデータベースが見つかりません:People」に注意してください。

つまり、SQLを実行してデータベースに対応するテーブルを作成する必要があります。VSを使用している場合は、モデルエディター(* .edmxファイル)のコンテキストメニューで、SQLそれを実行して、モデルに基づいてデータベースにテーブルエントリを作成します。注:非MS-SQL用に自動生成された問題には、コンパイル/実行する前に手動で修正する必要がある問題がある場合があります。

0
Ben Abraham