問題の概要:私はマスターと詳細エンティティを持っています。マスター(myMaster)を初期化すると、Details(myMaster.Detail)のインスタンスが作成され、myMasterが追加されると、その両方がデータベース内に残っているように見えます。しかし、コンテキストをリロードしてmyMasterReloaded.detailにアクセスすると、そのプロパティは初期化されません。しかし、コンテキストから直接詳細を引き出すと、これは魔法のようにmyMasterReloaded.detailを初期化するようです。私はこれを以下の最小ユニットテストの例で蒸留しました。これは「機能」ですか、それとも重要な概念の詳細が欠けていますか?問題エンティティフレームワークでの保存(概念的ヘルプが必要)
//DECLARE CLASSES
public class Master
{
[Key, DatabaseGenerated(DatabaseGenerationOption.Identity)]
public Guid MasterId { get; set; }
public Detail Detail { get; set; }
public Master() { Detail = new Detail(); }
}
public class Detail
{
[Key, DatabaseGenerated(DatabaseGenerationOption.Identity)]
public Guid DetailId { get; set; }
public Master MyMaster{ get; set; }
}
public class MyDbContext : DbContext
{
public DbSet<Master> Masters { get; set; }
public DbSet<Detail> Details { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Master>()
.HasOptional(x => x.Detail)
.WithOptionalPrincipal(x => x.MyMaster)
.WillCascadeOnDelete(true);
}
}
//PERFORM UNIT TEST
[TestMethod]
public void UnitTestMethod()
{
//Start with fresh DB
var context = new MyDbContext();
context.Database.Delete();
context.Database.CreateIfNotExists();
//Create and save entities
var master = context.Masters.Create();
context.Masters.Add(master);
context.SaveChanges();
//Reload entity
var contextReloaded = new MyDbContext();
var masterReloaded = contextReloaded.Masters.First();
//This should NOT Pass but it does..
Assert.AreNotEqual(master.Detail.DetailId, masterReloaded.Detail.DetailId);
//Let's say 'hi' to the instance of details in the db without using it.
contextReloaded.Details.First();
//By simply referencing the instance above, THIS now passes, contracting the first Assert....WTF??
Assert.AreEqual(master.Detail.DetailId, masterReloaded.Detail.DetailId);
}
(これは、より洗練されたエンティティセットのための争点である。私は単に私が単に複合型で詳細を置き換えることはできません最も単純な場合にこれをダウン蒸留しました)。
乾杯、 ロブ
それと、新しいMasterが自動的に新しいDetailを(そのctorで)作成するので、データベースからMasterをロードすると、新しいDetailインスタンスが作成されます。 –
エンティティをインスタンス化するときにEF4が何らかの理由でデフォルトのctorをバイパスしない限り。何でも可能だと思います。 –
ctor内にエンティティを作成しないでください。 EFは、それがするように設計されたことをしましょう。 – RPM1984