簡體   English   中英

如何使用實體框架 6 更新相關數據

[英]How to update related data using entity framework 6

我有一個實體Person ,它有一個相關的實體Hobby 這是一種多對多關系,一個人可以有多個愛好,而一個愛好可以與許多人相關聯。 我想創建一個ViewModel ,允許添加新的愛好和/或從給定的 Person 實體中刪除現有的愛好。

下面的代碼有效,但我認為它效率很低。

var newHobbies = new List<Hobby>();

foreach (Hobby hobby in vm.Hobbies)
{
    var originalHobby = db.Hobbies.Find(hobby.HobbyID);
    newHobbies.Add(originalHobby);
}

originalPerson.Hobbies = newHobbies;

我更喜歡做這樣的事情:

var newHobbies = db.Hobbies.Where(x => vm.Hobbies.All(y => x.HobbyID == y.HobbyID)).ToList();   
originalPerson.Hobbies = newHobbies;

但我收到一個錯誤:

在此上下文中僅支持原始類型或枚舉類型。

如何在不多次訪問數據庫的情況下更新相關數據?

該消息表示您不能在 LINQ-to-Entities 查詢中使用vm.Hobbies ,只能使用原始類型。 這是你可以做的:

var hobbyIds = vm.Hobbies.Select(h => h.HobbyId).ToList();
var newHobbies = db.Hobbies.Where(x => hobbyIds.Contains(x.HobbyID)).ToList();

為了避免這種異常,您可以首先從vm.Hobbies集合中選擇 Id,然后過濾您需要的愛好:

var Ids=vm.Hobbies.Select(x=>x.HobbyID);

var newHobbies = db.Hobbies.Where(x => Ids.Contains(x.HobbyID)).ToList();
// another option could be: db.Hobbies.Where(x => Ids.Any(id=>id==x.HobbyID)).ToList();    
originalPerson.Hobbies = newHobbies;

整體結構是這樣的:

  • 您的視圖采用顯示愛好列表的視圖模型
  • 你有一個動作來添加一個新的Hobby將一個Hobby實體作為動作的一部分傳回
  • 您只需調用回數據庫即可創建PersonHobby之間的新關聯
  • Hobby實體添加到Person集合中
  • 返回將視圖模型傳遞回視圖

一般來說,當您嘗試與作為整個實體的實體進行交互並且不嘗試對自己的 ID、實體水化等事物進行微觀管理時,EF 和 MVC 更容易使用。

您可以通過 ID 加入而不是從數據庫中獲取數據:

originalPerson.Hobbies = db.Hobbies.Join(vm.Hobbies, h => h.ID, 
    v => v.HobbyID, (h, v) => h).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM