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/