2015-11-07 60 views
1

在MVC 6中手動加載導航屬性的最佳方式是什麼?在MVC 6中手動加載導航屬性6

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Edit(Reservation reservation, bool ignoreConflicts = false) 
{ 
    int id = reservation.ItemID; // correct item ID 
    Item item = reservation.Item; // null 
} 

在這個例子中,當用戶提交表單,我得到了保留對象設置爲null所有的導航性能。

我能想到的最好方法是手動查找Item DbSet以找到具有匹配ID的項目並將其分配給導航屬性。

回答

1

好了,第一件事情第一......你是在MVC的行動。您將收到的將是客戶。不直接數據庫。

因此reservation.Item可能不爲空,但它可能不是真實的數據。

在這種情況下,您必須首先從服務器獲取數據,然後做一兩件事情:

  1. 更新從客戶端
  2. 使用收到你的EF7實體直接用手TryUpdateModelAsync自動更新您的當前實體。

這可能是這麼簡單:

public ActionResult Update(Reservation reservation) 
{ 
    var item = context.Items.FirstOrDefault(x => x.ID == reservation.ItemID); 
    await TryUpdateModelAsync(item); 
    // todo: save context 
    // return.... 
} 
+0

謝謝! TryUpdateModelAsync做到了這一點。 –

1

這是一個Entity Framework 7問題,而不是MVC6問題。 惰性加載尚未實現EF7,可能它根本不會。

您可以在這裏追蹤售票https://github.com/aspnet/EntityFramework/issues/3797

這意味着相反,我們需要做的是如你所說,是這樣的:

Item item = context.Items.FirstOrDefault(x => x.ID == reservation.ItemID);

+0

我的問題是關於明確加載。您提出的建議將會起作用,但在將更改保存到數據庫時會導致問題。 –