2

データベースからのデータの更新に問題があります。以下のコードを参照してください。ここで達成しようとしているのは、これです。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に相当するものがありますか?

4

1 に答える 1

1

DBContextで実行できない場合は、いつでもObjectContextにキャストして、その機能を使用できます。

MSDN:DbContextはObjectContextをラップし、簡略化されたより直感的なAPIを使用して、ObjectContextの最も一般的に使用される機能を公開します。DbContextでサポートされていない機能を使用する必要があるときはいつでも、基盤となるObjectContextにアクセスできます。

于 2013-03-12T11:35:54.787 に答える