データベースからのデータの更新に問題があります。以下のコードを参照してください。ここで達成しようとしているのは、これです。ProductProtocol(p)を作成し、ProductProtocolContentsのリストに1つのProductProtocolContentを追加します。次に、ロット全体をデータベースに保存します。その後、元に戻したい変更(別のProductProtocolContentの追加)をシミュレートし、リポジトリを使用してオブジェクトを更新した後、それをテストします。
var p = new ProductProtocol { Name = "test1" };
p.ProtocolContents.Add(new ProductProtocolContent { ValidFrom = DateTime.Now, Value = "9_qwe2341" });
var r = RepositoryFactory.Create<ProductProtocol>(unitOfWork);
r.Add(p);
unitOfWork.Commit();
// add another ProductProtocolContent, p.ProductProtocolContents.Count == 2
p.ProtocolContents.Add(new ProductProtocolContent { ValidFrom = DateTime.Now, Value = "9_truf7461" });
// undo the changes to the object
r.Refresh(p);
// reload the ProductProtocolContents from the database
r.LoadPropertySet(p, pc => pc.ProtocolContents);
// p.ProductProtocolContents.Count should be 1
Assert.IsTrue(p.ProtocolContents.Count == 1);
私の問題は、Assert.IsTrueが呼び出されたときにp.ProtocolContents.Count==0であるということです。
r.LoadPropertySet()の実装は次のとおりです。
public void LoadPropertySet<Y>(T target, Expression<Func<T, ICollection<Y>>> spec) where Y : BaseBusinessObject
{
context.Entry(target).Collection(spec).CurrentValue.Clear();
context.Entry(target).Collection(spec).Load();
}
Entity Framework 4を使用する(DbContextの代わりにObjectContextを使用する)私は単にこれを実行し、それは機能しました:
context.LoadProperty(target, spec, MergeOption.OverwriteChanges);
DbSetを使用してこれを行うにはどうすればよいですか、ObjectContextに変換し直す必要がありますか、それともDbSetに相当するものがありますか?