1

我有三张桌子:-

SecurityRole & Groups & SecurityRoleGroups。(安全角色可以有很多组。一个组可以有很多安全角色)

其中 SecurityRoleGroup 表是多对多关系表,Entity 框架不会映射该表。所以我想删除属于某个 SecurityRole 的所有 SecurityRoleGroup 记录。如果我写一些东西

SecurityRole securityrole = FindAllRole(id);

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

它会仅从 SecurityRoleGroup 中删除所需的记录,还是会删除相关的 SecurityRole 记录?

:::更新:::

但是,如果我只想删除多对多记录,以防它位于 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);

                                }
                            }
4

1 回答 1

2

如果您只想删除存储在链接表中的关系,而不是实体SecurityRoleGroups,则实体必须附加到当前关系中的上下文(即Groups 必须在实体的Groups集合中SecurityRole),然后您必须删除他们来自这个集合。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 的集合)

于 2013-07-18T17:42:11.777 回答