2011-07-06 17 views
0

問題

ないこれを行うための正しい方法がわから...私は単純なクラスを持っています3プロジェクトでは、イベントの説明を編集し、ドロップダウンリストから前のイベントを(オプションで)選択するためのフォームがあります。フォームは、アクションに提出して、MVC 3といつものように、自動的にEventにマップされます。EF 4.1 POCO()

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

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

質問

は、EFは、そのナビゲーションプロパティをロードすることに助けることができるように、そのプロキシの私の修正Eventを交換する方法はありますか?私は何ができる:

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

...しかし、すべてのナビゲーションプロパティをロードするこの方法は、世俗的なようです(図示よりも、このクラスの多くのがあります)、と私はEFがこれを行うためのより良い方法を持っている願っています。それは確かにそれですか?

答えて

1

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

あなたが使用する必要があります遅延読み込みをサポートしてインスタンスを作成するには:

Event event = context.Events.Create(); 

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

Event event = new Event(); 

遅延読み込みをサポートするには、独自のモデルバインダーを作成する必要があります。

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

+0

あなたは星です、これは私がそこにあることを望んでいたのと同じように見えます!今私はイベントのプロパティにダイナミックプロキシのプロパティをバインドする普遍的な方法を見つける必要があります:-) – Dav

+0

別のタスクでは、ちょうど '' TryUpdateModel''に出くわしました。法案はうまくいきます。しかし、私が '' Event eventDb = Db.Events.Create();を実行すると、 TryUpdateModel(eventDb); ''、 '' eventDb.PreviousEvent''はまだ型が動的プロキシである場合でもnullです。それはなぜですか? – Dav

+0

イベントをコンテキストに添付しましたか? –

関連する問題