Entity Framework 4 のインメモリ DB 質問する

Entity Framework 4 のインメモリ DB 質問する

.NET 4/EF 4 で適切に動作する優れたインメモリ DB をご存知の方はいらっしゃいますか? 具体的には、各セットアップで簡単に DB を作成し、デフォルト値を設定でき、各ティアダウンですばやく破棄できるようなユニット テストを考えています。

SQLiteについて聞いたことがあります.NET 4をサポートしていませんしかし、リリース モードでアプリケーションが実行される SQL Server の代替としてこれを使用することに問題を抱えている人もいます。

以前、私は DevExpress XPO ORM を使用していましたが、これにはユニットテストに非常に適して機能する組み込みのインメモリ データベースがありました。

ベストアンサー1

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

しかし、私は、実稼働コード (SQL 2008 で実行) を変更する必要のない簡単な回避策を見つけました。DbContext のプロキシ サブクラスを作成し、その中でオーバーライドしてOnModelCreating注釈を削除し、SaveChangesID を手動で設定するようにオーバーライドしました。

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/

おすすめ記事