2011-07-06 42 views
0

問題後

不知道該怎麼做了正確的方式,這是......我有一個簡單的類:EF 4.1 POCO訪問導航屬性Db.Entry()

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。這是有道理的 - 表單直接映射到我的POCO類Event,而不是EF創建的代理。

問題

有什麼辦法來交換我的修改Event其代理,以便EF可以幫忙與裝載它的導航性能?我可以這樣做:

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

你是一個明星,這看起來就像我希望的那樣!現在我只需要找到一些通用的方法來將動態代理的屬性綁定到我的Event屬性上,我們很好去:-) – Dav

+0

剛剛在另一個任務上遇到'TryUpdateModel',這似乎適合賬單很好。但是,當我做'Event eventDb = Db.Events.Create(); TryUpdateModel(eventDb);'',''eventDb.PreviousEvent''仍然是空的,即使你的類型是一個動態代理。爲什麼? – Dav

+0

您是否也將事件附加到上下文中? –