20

.NET 4/EF 4 でうまく動作する優れたメモリ内 DB を知っている人はいますか? 具体的には、各セットアップで DB を簡単に作成してデフォルト値を設定し、分解するたびに DB をすばやく破棄できるように、単体テストを考えています。

SQLite はまだ.NET 4 をサポートしていないと聞いたことがあります。また、SQLServer (アプリケーションがリリース モードで実行されるもの) の代わりとして使用するのに問題があるという人もいます。

以前、私は DevExpress XPO ORM を使用していましたが、これには組み込みのメモリ内データベースがあり、単体テストに非常に適していました。

4

3 に答える 3

8

CE4 はこれをサポートしていないため、モデルにデータベース生成キー (通常は [DatabaseGenerated(DatabaseGeneratedOption.Identity)] アノテーションを使用して EF4 で指定) がある場合、CE4 で単体テストを行うと問題が発生します。

しかし、本番コード (SQL 2008 で実行) を変更する必要のない簡単な回避策を見つけました。DbContext のプロキシ サブクラスを作成し、オーバーライドしOnModelCreatingてアノテーションを削除し、オーバーライドSaveChangesして ID を手動で設定しました。

public class TestContext : MyDbContext
{
  protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
  {
    modelBuilder.Entity<MyEntity>().Property(e => e.Id)
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

    base.OnModelCreating(modelBuilder);
  }

  public override int SaveChanges()
  {
    foreach (var entry in ChangeTracker.Entries<MyEntity>().Where(e => e.State == EntityState.Added))
    {
      entry.Entity.Id = Guid.NewGuid();
    }
    return base.SaveChanges();
  }
}

これらの微調整により、本番環境の SQL 2008 で実行される同じリポジトリ コードを CE4 で単体テストできるようになりました。

また、GUID ではなく整数 ID を使用している場合は、上記のソリューションに直接プラグインできる優れた拡張メソッドがあります: http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns -and-entity-framework/

于 2011-03-31T03:54:44.023 に答える
2

SQL CE がこれを行います。インプロセスで実行される組み込みデータベースです。EF4 (Code First を含む) で動作します。これを入手する最も簡単な方法は、NuGet パッケージを直接インストールすることです。NuGet パッケージは 2 つあります。1 つは SQL CE のみを含み、もう 1 つは EF Code First CTP4 で動作する SQL CE を含みます。

于 2010-11-18T04:45:37.233 に答える
1

EF CTP4 に切り替えても問題ない場合は、次のようになります。

EF4 CTP4 SQL CE 4 CTP

単体テスト (コードファースト) を作成すると、メモリ内に db が生成されます。

于 2010-11-19T09:09:06.623 に答える