【发布时间】:2015-12-26 15:52:51
【问题描述】:
我有一个多对多连接表,带有一个双键(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) 的选项,但这对我来说似乎效率低下。这真的是改变关系的唯一方法吗?
【问题讨论】:
-
猜猜
PersonId和RoleId是钥匙吗?如果是,则 EF 无法修改密钥。只是可以使用原始 sql 命令来更新它们。 -
您使用过 PersonsRoles 和 PeopleRoles。是错字吗?如果你展示你的模型会更好。
-
是的,是一个错字。并包括模型
-
context.Database.ExecuteSqlCommand("UPDATE PersonsRoles SET RoleId=2 WHERE PersonId=1 AND RoleId=1");也许这会起作用。
标签: c# entity-framework entity-framework-core