我正在尝试首先使用entityframework代码向链接表添加新记录。我所拥有的是User
和Role
上的多对多。我的场景是,当我为用户更改角色时,我会删除以前的所有角色并添加新角色,如下所示:
//Delete all associated roles for user
var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId);
var usersRoles = roleUser.Roles;
usersRoles.ForEach(role => roleUser.Roles.Remove(role));
//add the new roles
roleUser.Roles.AddRange(detachedUser.Roles);
db.SaveChanges();
所以它完全消除了它们。但是在添加新角色时,它不仅会将其添加到链接表中,还会添加到Role
表中。在没有RoleName
的情况下添加一个全新的角色。 user.Roles
将包含具有以下数据的项目:
RoleId;//1 <-- this Id exists in the database already but yet still it creates one instead of a linktable record.
RoleName;//null
如何阻止EF添加全新记录并只添加记录到链接表?
更新:我最终这样做了:
var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId);
var roles = db.Roles;
foreach (var role in roles)
{
if (user.Roles.Any(r => r.RoleId == role.RoleId))
{
roleUser.Roles.Add(role);
}
else
{
roleUser.Roles.Remove(role);
}
}
db.SaveChanges();
答案 0 :(得分:2)
在向用户添加新角色之前尝试保存
//Delete all associated roles for user
var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId);
var usersRoles = roleUser.Roles;
usersRoles.ForEach(role => roleUser.Roles.Remove(role));
db.SaveChanges();
roleUser.Roles.AddRange(user.Roles); //add the new roles
db.SaveChanges();
编辑:
看看这个:
roleUser.Roles.AddRange(user.Roles); //add the new roles
user.Roles
来自哪里?
答案 1 :(得分:1)
我认为您遇到的问题是在将角色添加到用户之前需要附加角色。
你也不需要全部删除它们,只需删除那些删除的那些,然后只添加新的。
答案 2 :(得分:0)
对于您添加的每个卷,您可以尝试检查或设置实体状态。例如,我在这里将集合设置为unchaged。这样它就不会尝试插入或更新它。
myContext.Entry(roll).State = EntityState.Unchanged