簡體   English   中英

實體框架避免多對多關系中的重復

[英]Entity Framework avoid duplications in many to many relations

我對 EF 6 數據庫優先的方法有些困惑。

我在 SQL 服務器中有 3 個表:

  • 成員
  • 團隊
  • JT_Teams_Members(聯結表)

我想將數據插入到這種關系中。

從代碼中,我得到了我迭代的團隊列表

插入:

foreach (var team in teams.Teams)
{
    var teamEntity = new Contexts.Team
            {
                TeamName = team.Name,
                ....
            };

    foreach (var member in team.Members)
    {
        teamEntity.Members.Add(
                new Contexts.Member()
                {
                    MemberName = member.Name,
                    EmailAddress = member.Email,  
                ...
                });
    }

    DbUtility.Context.Teams.Add(teamEntity);
}

我的問題是我在 members 表中發現了很多重復,這不太好。

如何管理插入以避免重復並將 ID 重定向到正確的位置?

在處理關聯時,您將希望對相關實體使用相同的引用,而不是為每個相關實體新建一個引用。

如果我要插入多個包含成員的團隊,其中一些成員可能是新成員並在團隊之間共享,而其他成員可能是數據庫中已有的成員:

  1. 對於所有關聯實體,始終在您的視圖模型中傳遞 PK。 對於會員,如果您可以從現有會員中獲取 select,即使您只顯示姓名和電子郵件地址,也請在您的視圖 model 中傳遞會員 ID 以供以后查找。

從那里我們可以開始看下面的東西:

var memberIds = teams.Teams
    .SelectMany(t => t.Members)
    .Select(m => m.MemberId)
    .Where(m => m.MemberId != 0)
    .ToList();

var existingMembers = Context.Members
    .Where(m => memberIds.Contains(m.MemberId))
    .ToList();


foreach (var team in teams.Teams)
{
    var teamEntity = new Contexts.Team
    {
        TeamName = team.Name,
        ....
    };

    foreach (var member in team.Members)
    {   //We assume that all e-mail addresses are unique.
        var existingMember = existingMembers.SingleOrDefault(m => m.Email == member.Email);
        if (existingMember == null)
        {
            existingMember = new Member()
            {
                MemberName = member.Name,
                EmailAddress = member.Email,  
            ...
            });
            existingMembers.Add(existingMember); // For future reference.
        }
        teamEntity.Members.Add(existingMember);
    }

    DbUtility.Context.Teams.Add(teamEntity);
}

第一步是為團隊尋找任何現有成員。 如果您知道將存在現有成員,那么您可以跳過該加載,而只需使用最初為空的集合。 當我們通過我們的團隊 go 時,我們首先檢查現有集合中是否有與電子郵件地址匹配的成員。 如果我們找到一個,我們使用它,否則我們創建一個新成員並將其添加到集合中。 這樣,當添加具有相同成員的另一個團隊時,它會在集合中找到並且將使用相同的引用。

當 EF 插入數據時,它尊重引用,不一定是 ID/約束將實體關聯到相同的引用,而不是創建重復項。 如果您有 2 個實體引用同一個成員 (joe.smith@gmail.com),那么您要確保兩個實體引用 joe.smith 的同一個成員實體,而不是 2 個具有相同電子郵件地址的不同實體。 在處理批量操作(插入許多團隊)時,您將希望保留本地緩存或從 DbContext 讀取以利用其緩存。 對於單個操作,您應該始終 go 到 DbContext 以在嘗試創建新引用之前檢索現有實體(如果可用)。 (避免重復數據或違反約束/重復鍵異常。)

暫無
暫無

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

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