【发布时间】:2011-04-11 15:20:12
【问题描述】:
我正在尝试首先使用实体框架代码将新记录添加到链接表中。我在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();
【问题讨论】:
-
显然已解决,但无法了解已解决的问题。您能否再次发布答案中阻止创建新角色的部分。
标签: entity-framework ef-code-first