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.NetworkWebRoleAdd 方法时,它会自动在 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();

找到了

的答案