2013-07-18 62 views
1

我有三個表: -刪除許多一對多導航屬性

SecurityRole &組& SecurityRoleGroups。 (securityrole可以有多個組,並且一個組可以有很多securityroles)

其中SecurityRoleGroup表是一個多對多的關係表,Entity框架不會映射這個表。所以我想刪除屬於某個SecurityRole的所有SecurityRoleGroup記錄。如果我寫東西如

SecurityRole securityrole = FindAllRole(id); 

tms.SecurityRoles.Remove(securityrole).Groups.Where(a=> a.GroupID == group.GroupID) 

它只會從SecurityRoleGroup中刪除所需的記錄,否則它也會刪除相關的SecurityRole記錄?

::: UPDATE :::

但是,如果我想刪除許多一對多戰績僅爲櫃面它是currentGroups [C]數組裏面是什麼。我可以寫的東西如下: -

if (group.GroupID == currentGroups[c]) 
          { 
var securityrole = tms.SecurityRoles.Where(a => a.SecurityRoleID == id).Include(p => p.Groups).SingleOrDefault(); 

    (securityrole != null) { 

    securityrole.Groups.Remove(group); 

           } 
          } 
+0

我不明白你的代碼。 'Remove'返回一個'bool'。如果從多對多集合中刪除它們,相關實體不會被刪除。 –

+0

我知道,我想刪除M-to-M記錄。 –

回答

2

如果你想刪除只存儲在鏈接表的關係,而不是實體SecurityRoleGroup秒,實體必須在目前的關係附加到上下文(即Group必須位於SecurityRole實體的Groups集合中),然後您必須將它們從此集合中刪除。 EF將跟蹤此更改並將DELETE語句單獨寫入鏈接表。

它可以實現像這樣:

using (var context = new MyContext()) 
{ 
    var securityRole = context.SecurityRoles 
     .Include(s => s.Groups) // or Include("Groups") for EF <= 4.0 
     .SingleOrDefault(s => s.SecurityRoleId == givenId); 

    if (securityRole != null) 
    { 
     securityRole.Groups.Clear(); 
     context.SaveChanges(); 
    } 
} 

編輯

如果你想刪除滿足給定的條件下使用的Remove代替Clear唯一紐帶記錄:

if (securityRole != null) 
    { 
     foreach (var group in securityRole.Groups 
      .Where(g => currentGroups[c].Contains(g.GroupID)).ToList()) 
     { 
      securityRole.Groups.Remove(group); 
     } 
     context.SaveChanges(); 
    } 

(假設currentGroups[c]是組ID的集合)

+0

非常感謝您的回覆,您可以檢查一下我的更新。 –

+0

@JohnPeter:看看我的編輯上面。 – Slauma