更新多对多EF

时间:2013-03-29 08:19:50

标签: entity-framework record

我创建了一个函数来更新数据库中的记录:

    Users (UserId, Name)
    UsersRoles (UserId, RoleId)
    Roles (RoleId, Name)

我将parameter_user和parameter_role传递给函数。 如果它们位于相应的表中,则更新数据。 但是,它不会更新数据,而是每次都将它们放入。

因此,如果表UsersRoles看起来像这样:

10 25
10 23
10 28
11 25
11 32

我想更新第10行到第27行27,它增加了一个记录10 27,但它留下了10 23。 我想你不能改变,因为它是一个双FK。 但是如何删除旧记录10 23?

功能是这样的:

         var user = (from r in context.Users where r.UserId.Equals(parameter_user) select r).FirstOrDefault();
         Roles role;
         if (parameter_role > 0)
         {
           role = (from r in context.Roles where r.RoleId.Equals(parameter_role) select r).FirstOrDefault();
           if (role == null) return false;
             if (user != null)
             {
               role.Users.Add(user);
             }
               role.Name = "Paul";
            }

非常感谢再见

1 个答案:

答案 0 :(得分:1)

您希望将角色27添加到用户10并从用户10中删除角色23.您必须完全执行以下两个步骤来“更新”UserRoles表(它实际上是后续的INSERT和DELETE)

看起来像这样:

if (parameter_role > 0)
{
    var user = (from r in context.Users.Include("Roles") // include the roles
                where r.UserId.Equals(10) // parameter_user
                select r).FirstOrDefault();

    if (user != null)
    {
        Roles oldRole = (from r in user.Roles
                         where r.RoleId.Equals(23)
                         select r).FirstOrDefault();
        if (oldRole != null)
            user.Roles.Remove(oldRole);

        Roles newRole = (from r in context.Roles
                         where r.RoleId.Equals(27) // parameter_role
                         select r).FirstOrDefault();
        if (newRole != null)
            user.Roles.Add(newRole);

        user.Name = "Paul";
    }
}

如果您要删除所有旧角色并仅添加新角色27,请使用user.Roles.Clear()代替...Remove(oldRole)

    //...
    if (user != null)
    {
        user.Roles.Clear();

        Roles newRole = ... // etc.
        //...
    }