多个实体框架不断添加额外的记录

时间:2011-04-11 15:20:12

标签: entity-framework ef-code-first

我正在尝试首先使用entityframework代码向链接表添加新记录。我所拥有的是UserRole上的多对多。我的场景是,当我为用户更改角色时,我会删除以前的所有角色并添加新角色,如下所示:

//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();

3 个答案:

答案 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

更多信息: http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx