1

私はEFでいくつかのテストを行っており、ObjectContext.SavingChangesにフックを取得しようとしていました。コンテキスト内のセットにオブジェクトを直接追加すると、すべてが機能します。しかし、エンティティnavプロパティを介してそれらを追加すると、イベントに表示されません。

より明確にするために例を示します。これは、SavingChangesイベントに登録されているメソッドです。

void SavingChanges(object sender, System.EventArgs e)
{   var oc = (ObjectContext)sender;
    foreach (var entity in oc.ObjectStateManager
        .GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Unchanged | EntityState.Modified))
        Debug.WriteLine(entity);

}

そして、これは私がコンテキストに何かを追加する方法です。

var w1 = new Workspace()
             {
                 Name = "teste1",
             }; 

var w2 = new Workspace()
             {
                 Name = "teste2"
             }; 

var w3 = new Workspace()
             {
                 Name = "teste3"
             }; 

var w4 = new Workspace()
             {
                 Name = "teste4"
             }; 

//this shows up in the event
context.Workspaces.Add(w1);

//these do NOT show up on the event
w1.Children.Add(w2);
w1.Children.Add(w3);
w1.Children.Add(w4);

context.SaveChanges();

SaveChangesが呼び出されたときに追加されたすべてのエンティティを取得する方法はありますか?それらは私のデータベースに永続化されているので、いつ発生するのか知りたいです。

ありがとう!

編集:私はCTP4でEF4を使用しています。

edit2:これは私のPOCOです。

public class Workspace
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }  

    public virtual ICollection<Workspace> Children{ get;set;}

    public virtual Workspace Parent { get; set; }
}
4

1 に答える 1

0

さて、問題は変更追跡の欠如にありました。私はプロキシを使用してそれを実行しようとしていましたが、「new」演算子はどのような種類のプロキシも作成しないことが判明したため、オブジェクトへの追跡は行われず、それらに追加されたものはコンテキストに追加されません。

プロキシを作成するには、ObjectContext.CreateObject を呼び出す必要がありました。私が DbContext を使用していたことを考えると、解決策は内部 ObjectContext を公開するか、コンテキストを内部的に呼び出すメソッドを作成することでした。私は後者に行きました。

しかし、これはハックのようです。よりエレガントなソリューションについて何か提案はありますか?

編集:これは機能しますが、DbContext API のみに固執することは可能です。これは、非プロキシ POCO を使用し、SavingChanges イベントが発生する前に DetectChanges を呼び出すことによって行われます。

于 2010-09-14T22:52:50.770 に答える