3

INotifyPropertyChangedを実装する共通のビジネスベースクラスから継承するPOCOがいくつかあります。DALでもEF5を使用しています。以下のように、単一の競合オブジェクトに対してフェッチを実行する場合:

public ICompetitorCard Fetch(long id)
        {
            return this.Fetch<ContactCardContext, ICompetitorCard>(
               () => { return ContactCardContext.GetInstance(this); },
               ctx =>
               {
                   var query = from competitor in ctx.Competitors
                               where competitor.Id == id
                               select competitor;

                   return query.SingleOrDefault();
               }, "ICompetitorCard Fetch(long id) failed");
        }

EF5でうまく埋められたCompetitorCardオブジェクトを取り戻します。問題は、DALからロードするときに通知を起動したくないということです。したがって、通常、オブジェクトが初期化されているかどうかを追跡するある種のフィールドを設定する場合があります。これは「通常」に実装するのは簡単ですが、この場合はEFがロードを実行しているため、設定するためにどのイベント/仮想メソッドにフックする必要があるのか​​疑問に思います。

IsInitialised = true;

その後、プロパティ通知が発生するように。私は次のようなことができると思います:

ICompetitorCard card = query.SingleOrDefault();
if (card!=null){card.IsInitialised = true;}
return card;

しかし、それは過度に冗長に見え、カプセル化を破り、コレクションなどにとって苦痛です。それで、INotifyPropertyChangedの独自の実装を処理する人にとって、EF5でこれをどのように管理していますか?

4

2 に答える 2

3

オブジェクト内のイベントをサブスクライブすることで「アクティブ化」INotifyPropertyChangedします。これは、オブジェクトがインスタンス化されるまで実行できません。

オブジェクト内では、サブスクライバーがいない限り、変更イベントを発生させません。

詳細については、 MSDNを参照してください。


アップデート:

ObjectMaterializedのイベントをサブスクライブしてObjectContext、オブジェクトをロード済みとしてマークできます。このようなもの:

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
this.ObjectContext_OnObjectMaterialized;

関数を実装する

ObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e).

EventArgs実現したばかりのオブジェクトが表示されます。

于 2013-03-22T10:38:52.677 に答える
0

通常、エンティティフレームワークに使用されるpocoタイプはINotifyPropertyChangedを実装しません。必要なプロパティの値を新しいタイプにマップし、ビューにバインドします(INotifyPropertyChangedを実装します)...アーキテクチャに応じてビジネスオブジェクトであるか、ビューモデルである可能性があります。

これは多くのシナリオで役立ちます。特に、データベースがUIを完全に表すことはめったにないためです。

于 2013-03-22T09:13:59.143 に答える