我有一个具有双键(PersonId,RoleId)的多对多联接表。为了简单起见,我的Person表中只有一个PersonId。同样,使用EF7,它还不支持EF6的很多优点(例如,通过导航属性连接表的隐式性)。
我可以在SQLite中运行此查询,并且可以正常使用:update PersonRole set RoleId = 2 where PersonId = 1
,我无法在EF中执行相同的操作:
var du = context.PersonsRoles.Where(p => p.PersonId == 1).First();
du.RoleId = 2;
context.PersonsRoles.Update(du);
context.SaveChanges(); //get an error here
错误是这样的:“发生了未处理的异常:实体类型'PersonRole'上的属性'RoleId'是键的一部分,因此无法进行修改或标记为已修改。”
(下面的每个评论的ETA)-我的模型是:
public class PersonRole
{
public virtual int PersonId { get; set; }
public virtual int RoleId { get; set; }
}
我找到了一个答案,其中包括删除原始行(1,1)然后重新插入(1,2)的选项,但这对我来说似乎效率很低。那真的是修改关系的唯一方法吗?
您正在尝试在一侧修改多对多关系的键。数据库中用表保存多对多关系,该表包含关系中双方的外键。
您尝试做的是尝试更改对象的键,但是外键表中仍然保留了引用,这导致约束冲突-因为NN表中的值尚未更新。
EF7中不允许进行此更改。您应该使用SQL命令来执行此操作,而不要考虑多对多表更新。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句