3

クエリからロードされているときに、実際のアイテムが ICollection<> 仮想メンバーに追加されるタイミングを判断する方法はありますか?

以下のコードが私の要点を実証できることを願っています!!

public class DbAppointment
{
    public DbAppointment()
    {
    }

    public virtual int AppointmentId { get; set; }
    public virtual string Subject { get; set; }
    public virtual string Body { get; set; }
    public virtual DateTime Start { get; set; }
    public virtual DateTime End { get; set; }

   private ICollection<DbExceptionOcurrence> exceptionOcurrences;
   public virtual ICollection<DbExceptionOcurrence> ExceptionOcurrences
   {
        get { return exceptionOcurrences; }
        set
        {
            exceptionOcurrences = value;
        }
    }
}

public class DbExceptionOcurrence
{
    public DbExceptionOcurrence()
    {
    }

    public virtual int ExceptionId { get; set; }
    public virtual int AppointmentId { get; set; }
    public virtual DateTime ExceptionDate { get; set; }
    public virtual DbAppointment DbAppointment { get; set; }
}

これらをロードするためのコードは

        Database.SetInitializer(new ContextInitializer());
        var db = new Context("EFCodeFirst");

        // when this query executes the DbAppointment ExceptionOcurrenes (ICollection) is set
        // but for some reason I only see this as an empty collection in the virtual setter DbAppointment
        // once the query has completed I can see the ExceptionOcurrences
        var result = db.Appointments.Include(a => a.ExceptionOcurrences).ToList();

各項目の DbAppointment ICollection ExceptionOcurrences セッターで、追加のロジックを実行する必要があります。私が抱えている問題は、DbAppointment オブジェクトが既に作成されている場合にのみ、この情報を持っているように見えることです。

ロジックを実行できるように、アイテムがいつ追加されたかを判断する方法はありますか?

乾杯腹筋

4

1 に答える 1

2

どうやら、あなたが見ている動作は、Entity Framework が次のようなコレクションを作成して埋めることを意味します。

// setter called with empty collection
dbAppointment.ExceptionOcurrences = new HashSet<DbExceptionOcurrence>();

// only getter gets called now
dbAppointment.ExceptionOcurrences.Add(dbExceptionOcurrence1);
dbAppointment.ExceptionOcurrences.Add(dbExceptionOcurrence2);
dbAppointment.ExceptionOcurrences.Add(dbExceptionOcurrence3);
//...

ObjectMaterialized Eventを使用できることを望んでいました(DbContextこの例のように登録できます: https://stackoverflow.com/a/4765989/270591、 EventArgs には実体化されたエンティティが含まれています) が、残念ながらドキュメントには次のように書かれています:

このイベントは、すべてのスカラー プロパティ、複合プロパティ、および参照プロパティがオブジェクトに設定された後、コレクションが読み込まれる前に発生します。

結果コレクションが完全にロードされた後、結果コレクションを実行し、ナビゲーション コレクションでカスタム ロジックを実行する各結果項目で何らかのメソッドを呼び出す必要があるようです。

ICollection<T>おそらく別のオプションは、メソッドのイベント ハンドラーを実装するカスタム コレクション型を作成しAdd、新しい項目が追加されるたびに何らかのロジックをフックできるようにすることです。モデル クラスのナビゲーション コレクションは、その型でなければなりません。たぶんObservableCollection<T>、この目的には問題ありません。

于 2012-06-16T12:35:21.667 に答える