Entity framework 实体框架多对多不断添加额外记录
我试图首先使用entityframework代码向链接表添加一条新记录。我拥有的是Entity framework 实体框架多对多不断添加额外记录,entity-framework,ef-code-first,Entity Framework,Ef Code First,我试图首先使用entityframework代码向链接表添加一条新记录。我拥有的是用户和角色上的多对多。我的场景是,当我为用户更改角色时,我会删除他们以前的所有角色,并添加新角色,如下所示: //Delete all associated roles for user var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId); var usersRoles =
用户
和角色
上的多对多。我的场景是,当我为用户更改角色时,我会删除他们以前的所有角色,并添加新角色,如下所示:
//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();
所以它完美地去除了它们。但在添加新角色时,它不仅将其添加到链接表中,还将其添加到角色
表中。添加了一个全新的角色,但没有RoleName
<代码>用户。角色将包含具有以下数据的项:
RoleId;//1 <-- this Id exists in the database already but yet still it creates one instead of a linktable record.
RoleName;//null
在向用户添加新角色之前,请尝试保存
//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
来自哪里?对于您添加的每个卷,您可以尝试检查或设置实体状态。例如,在这里我将set设置为unched。这样它就不会试图插入或更新它
myContext.Entry(roll).State = EntityState.Unchanged
更多信息请点击此处:
我认为您遇到的问题是,在将角色添加到用户之前,您需要附加角色
您也不需要全部删除它们,只需删除已删除的角色,然后只添加新角色。在添加第二个SaveChanges后,我仍然遇到同样的问题。我认为这就是添加新角色的方式。我可能必须从数据库中获取所有这些文件并添加它们。当您遇到类似这样的问题时,您可能还需要查看您的绑定配置。我过去也遇到过类似的问题。从数据库中取回它们会改变什么吗?@lol coder,你已经找到了创建角色的原因。这些实体被视为新的实体。很高兴看到你已经解决了:)是的,但是如果他在尝试添加新角色之前保存了,那么实体的状态不会保持不变(保存后)吗?我同意@moi_meme的观点,即你只需要删除那些需要删除的。另一方面,我不认为这是一个涉及附加/分离状态的问题。因为对象从未分离。@Alexandre Brisebois-我写道,因为他的变量被称为DetachedUsermy bad,所以我没有注意到部分显然已经解决了,但无法理解是什么解决了它。请你再贴一次答案中阻止创建新角色的部分。
myContext.Entry(roll).State = EntityState.Unchanged