Entityframework 为什么耦合 table 会得到重复的值?
Entityframework why does coupling table get duplicated values?
我想在应用程序中创建新用户并为他们分配角色。我在用户和角色 table 之间有一个耦合 table。我设法在 table 之间建立了关系,但同时我得到了重复项。
我的模型:
问题:
创建关系后获取重复项。假设我创建了一个角色为 "Support" 的用户。 networkWebuserRoles 获取关系,但同时 NetworkWebRole 获取重复值。
上下文:
代码:
var user = _dbContext.NetworkWebUser.FirstOrDefault(x => x.UserName == userName);
user.NetworkWebRole.Add(new NetworkWebRole
{
RoleName = role.ToString()
});
_dbContext.SaveChanges();
在角色和用户之间建立了关系,但它给了我重复项。
结果:
编辑:
澄清一下:
当我 运行 上面的代码发生时:
NetworkWebUserRoles 获取新连接。但是由于某种原因
NetworkWebRole 也获得了一个新值,所以我得到了重复项
您正在创建一个新的 NetworkWebUserRole,而不是链接到现有记录。
我还建议在 NetworkWebUserRole 上创建唯一性约束,以防止角色在数据库级别重名。
示例:
user.NetworkWebRole.Add(role);
这假定您的角色变量是 NetworkWebRole
类型。当您使用 user.NetworkWebRole
的 Add
方法时,它会自动在 NetworkWebUserRole
table 中创建条目。如果该角色不存在,例如调用 new NetworkWebRole()
,它将插入耦合 table 和 NetworkWebUserRoles
table。因此,通过传递现有角色对象(可能由您的 EF 上下文跟踪),您就可以开始了。
感谢@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();
找到了
的答案
我想在应用程序中创建新用户并为他们分配角色。我在用户和角色 table 之间有一个耦合 table。我设法在 table 之间建立了关系,但同时我得到了重复项。
我的模型:
问题:
创建关系后获取重复项。假设我创建了一个角色为 "Support" 的用户。 networkWebuserRoles 获取关系,但同时 NetworkWebRole 获取重复值。
上下文:
代码:
var user = _dbContext.NetworkWebUser.FirstOrDefault(x => x.UserName == userName);
user.NetworkWebRole.Add(new NetworkWebRole
{
RoleName = role.ToString()
});
_dbContext.SaveChanges();
在角色和用户之间建立了关系,但它给了我重复项。
结果:
编辑:
澄清一下:
当我 运行 上面的代码发生时:
NetworkWebUserRoles 获取新连接。但是由于某种原因 NetworkWebRole 也获得了一个新值,所以我得到了重复项
您正在创建一个新的 NetworkWebUserRole,而不是链接到现有记录。
我还建议在 NetworkWebUserRole 上创建唯一性约束,以防止角色在数据库级别重名。
示例:
user.NetworkWebRole.Add(role);
这假定您的角色变量是 NetworkWebRole
类型。当您使用 user.NetworkWebRole
的 Add
方法时,它会自动在 NetworkWebUserRole
table 中创建条目。如果该角色不存在,例如调用 new NetworkWebRole()
,它将插入耦合 table 和 NetworkWebUserRoles
table。因此,通过传递现有角色对象(可能由您的 EF 上下文跟踪),您就可以开始了。
感谢@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();
找到了