[英]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
實體作為動作的一部分傳回Person
和Hobby
之間的新關聯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.