我想在应用程序中创建新用户并为其分配角色。我在用户和角色表之间有一个耦合表。我设法在表之间创建关系,但是同时我得到了重复项。
我的模型:
问题:
在创建关系后获取重复项。可以说我创建了一个具有“支持”角色的用户。 networkWebuserRoles获取关系BUT,同时NetworkWebRole获取重复值。
上下文:
代码:
var user = _dbContext.NetworkWebUser.FirstOrDefault(x => x.UserName == userName);
user.NetworkWebRole.Add(new NetworkWebRole
{
RoleName = role.ToString()
});
_dbContext.SaveChanges();
在角色和用户之间建立关系,但给我重复的内容。
结果:
编辑:
要澄清:
当我在上面运行代码时,会发生这种情况:
NetworkWebUserRoles获得新的连接。但是由于某种原因 NetworkWebRole也获得了一个新值,所以我得到了重复项
答案 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