[英]Entity Framework and (1 to many)-(many to 1) (1 - * * - 1) relations
[英]Entity Framework avoid duplications in many to many relations
我對 EF 6 數據庫優先的方法有些困惑。
我在 SQL 服務器中有 3 個表:
我想將數據插入到這種關系中。
從代碼中,我得到了我迭代的團隊列表
插入:
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 重定向到正確的位置?
在處理關聯時,您將希望對相關實體使用相同的引用,而不是為每個相關實體新建一個引用。
如果我要插入多個包含成員的團隊,其中一些成員可能是新成員並在團隊之間共享,而其他成員可能是數據庫中已有的成員:
從那里我們可以開始看下面的東西:
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.