簡體   English   中英

比較和插入/更新/刪除實體框架中的子級

[英]Comparing and insert/update/delete children in Entity Framework

我有一個選擇表格,需要保存到數據庫中。 用戶可以在隨后的訪問中編輯其選擇。 這些項目是在具有唯一ID的表中定義的,因此該表格僅返回ID列表。

就像這樣:

Fruits:
    { id=1, name="apple" }
    { id=2, name="orange" }
    { id=3, name="banana" }

People:
    { id=1, name="user", fruits=apple,orange }

在數據庫中,有一個鏈接表,鏈接人的ID和水果的ID。

現在,當我收到一個編輯請求時,我需要與現有水果進行比較,以便知道是否需要添加或刪除條目。

foreach (var fruit in existing_fruits)
{
    if (post_fruits.Where(e => e.id == fruit.id).Count() == 0) user.Fruits.Remove(fruit);
}

foreach (var fruit in post_fruits)
{
    if (existing_fruits.Where(e => e.id == fruit.id).Count() == 0)
    {
        var entity = context.Fruit.Where(e => e.id == fruit.id);
        user.Fruits.Add(entity);
    }
}

如您所見,列表上有多個循環和多個調用,這使我想知道是否有更清潔的方法?

如果在這里使用.Any方法會怎樣(盡管它仍然使用兩個循環,但效率更高):

foreach (var fruit in existing_fruits)
    if (!post_fruits.Any(e => e.id == fruit.id)) user.Fruits.Remove(fruit);

foreach (var fruit in post_fruits)
{
    if (existing_fruits.Any(e => e.id == fruit.id)) continue;
    var entity = context.FirstOrDefault(e => e.id == fruit.id);
    if(entity != null) user.Fruits.Add(entity);
}

但是最好將數據庫體系結構更改為:

Fruits:
    { id=1, name="apple" }
    { id=2, name="orange" }
    { id=3, name="banana" }

People:
    { id=1, name="user" }

PeopleFruits
    { id=1, fruitId = 1, personId = 1, isSelected = 0}

現在只需更新記錄就是獲取某人的此PeopleFruits實體。

PeopleFruits[] personPplFruits = cont.PeopleFruits.Where(pf => pf.personId == 1).ToArray();

並根據用戶選擇的內容更新.isSelected屬性。

請檢查這篇文章: https : //www.simple-talk.com/sql/database-administration/how-to-get-database-design-horribly-wrong/

EntityFramework.Extended中有很多有用的功能。 它包含批處理更新和刪除功能,該功能在您遇到的情況中很有用,還消除了在修改實體之前檢索和加載實體的需求,因此將來可以提高性能。

暫無
暫無

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

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