0

問題

これを行う正しい方法がわからない...私は単純なクラスを持っています:

public partial class Event
{
    public int Id { get; set; }
    public string Description { get; set; }
    public int? PreviousEventId { get; set; }
    public virtual Event PreviousEvent { get; set; }
}

私の MVC 3 プロジェクトには、イベントの説明を編集し、(オプションで) ドロップダウン リストから前のイベントを選択するために使用するフォームがあります。フォームはアクションに送信され、通常の MVC 3 と同様に、自動的に にマップされますEvent

[HttpPost]
public ActionResult SaveEvent(Event myEvent)
{
    if (ModelState.IsValid)
    {
        Db.Entry(myEvent).State = EntityState.Modified;
        // do some additional checks
        Db.SaveChanges();
    }
}

PreviousEventエンティティを保存する前に、アクセスが必要な追加の検証を行いたいと思います。ただし、ナビゲーション プロパティはnull、上記のコードでアクセスするときは常にです。これは理にかなっています。フォームはEvent、EF によって作成されたプロキシではなく、私の POCO クラスに直接マップされます。

質問

EventEF がナビゲーション プロパティの読み込みを支援できるように、変更したものをプロキシに交換する方法はありますか? 私はそれをできた:

Db.Entry(myEvent).Reference(e => e.PreviousEvent).Load();
// do some checking on myEvent.PreviousEvent

...しかし、この方法ですべてのナビゲーション プロパティを読み込むのは平凡に思えます (このクラスには、示されているよりも多くの機能があります)。本当にそうですか?

4

1 に答える 1

1

あなたが求めているのは、アクションに渡されたエンティティ インスタンスでの遅延読み込みのサポートです。遅延読み込みは、EF によって作成された動的プロキシ (= 動的に作成された派生型) を介して提供されます。インスタンスがプロキシなしで作成されると、遅延読み込みを使用できず、それを許可するように変更することもできません!

遅延読み込みをサポートするインスタンスを作成するには、次を使用する必要があります。

Event event = context.Events.Create();

ただし、デフォルトのモデル バインダーは単にデフォルトのコンストラクターを使用します。

Event event = new Event();

したがって、遅延読み込みのサポートが必要な場合は、そのための独自のモデル バインダーを作成する必要があります。

インスタンスをプロキシしたら、インスタンスをコンテキストにアタッチするだけで、遅延読み込みが機能するはずです。

于 2011-07-06T12:27:49.003 に答える