Entityframework为什么耦合表获得重复的值?

时间:2018-11-29 14:32:27

标签: c# asp.net-mvc entity-framework ef-database-first

我想在应用程序中创建新用户并为其分配角色。我在用户和角色表之间有一个耦合表。我设法在表之间创建关系,但是同时我得到了重复项。

我的模型:

enter image description here

问题

在创建关系后获取重复项。可以说我创建了一个具有“支持”角色的用户。 networkWebuserRoles获取关系BUT,同时NetworkWebRole获取重复值。

上下文:

enter image description here

代码:

    var user = _dbContext.NetworkWebUser.FirstOrDefault(x => x.UserName == userName);

    user.NetworkWebRole.Add(new NetworkWebRole
    {
        RoleName = role.ToString()
    });

    _dbContext.SaveChanges();

在角色和用户之间建立关系,但给我重复的内容。

结果:

enter image description here

编辑:

要澄清:

当我在上面运行代码时,会发生这种情况:

NetworkWebUserRoles获得新的连接。但是由于某种原因 NetworkWebRole也获得了一个新值,所以我得到了重复项

2 个答案:

答案 0 :(得分:3)

您要创建一个新的NetworkWebUserRole而不是链接到现有记录。

我还建议在NetworkWebUserRole上创建唯一性约束,以防止角色在数据库级别具有重复的名称。

示例:

user.NetworkWebRole.Add(role);

这假定您的角色变量的类型为NetworkWebRole。当您使用Add的{​​{1}}方法时,它将自动在user.NetworkWebRole表中创建条目。如果角色不存在,例如调用NetworkWebUserRole,它将插入到耦合表和new NetworkWebRole()表中。因此,通过传递现有角色对象(大概是通过EF上下文进行跟踪),您就可以开始工作了。

答案 1 :(得分:1)

由于@Jason Armstrong,我将代码修改为以下内容:

var user = _dbContext.NetworkWebUser.FirstOrDefault(x => x.UserName == userName);

// find the role that already exist in the database
var roleExisting = _dbContext.NetworkWebRole.FirstOrDefault(x => x.RoleName == role.ToString());

user.NetworkWebRole.Add(roleExisting); // connect the user to an existing role
                                     // entity framework add() will connect 
                                     //it in relationship table

_dbContext.SaveChanges();

对于那些可能为此感到困惑的人来说,要注意的是您不想创建新角色,因此new Role()`在这里是不正确的。您从数据库中获取一个现有角色,并将用户连接到该角色。

我还更新了角色表,以便角色名唯一

编辑:

作为对此的编辑,我认为最好也知道如何删除该关系。

就我而言:

    var user = _dbContext.NetworkWebUser.Where(x => x.Id == id).Include(v=> v.NetworkWebRole);

    _dbContext.NetworkWebUser.RemoveRange(user);

    _dbContext.SaveChanges();

找到了答案here