c# - 使用 Entity Framework 更新多对多关系?

标签 c# entity-framework entity-framework-core

我有一个多对多连接表,带有双键(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”是键的一部分,因此无法修改或标记为已修改。”

(预计到达时间如下) - 我的模型是:

public class PersonRole
    {
        public virtual int PersonId { get; set; }

        public virtual int RoleId { get; set; }
    }

我找到了一个答案,其中包含删除原始行 (1, 1) 然后重新插入 (1, 2) 的选项,但这对我来说似乎效率低下。这真的是改变关系的唯一方法吗?

最佳答案

您正在尝试修改一侧多对多关系的键。多对多关系在数据库中用一个表来表示,该表保存关系双方的外键。

您尝试执行的操作是尝试更改对象的键,但外键表中仍保留引用,导致违反约束 - 因为 N-N 表中的值尚未更新。

EF7 中不允许进行此更改。您应该使用 SQL 命令来执行此操作,而不是考虑多对多表更新。

关于c# - 使用 Entity Framework 更新多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34472865/

相关文章:

c# - 如何检查泛型方法参数是否为值类型?

c# - Entity Framework 绕过 QueryFilter/SoftDelete

c# - Entity Framework Core 5.0 警告限制运算符 ('Skip'/'Take' ) 没有 'OrderBy' 运算符

c# - AdjustThreadsInPool , 线程中止异常

c# - 如何在 memcached 中存储 protobuf 对象?

entity-framework - 更新多对多 Entity Framework 模型中的审计字段

c# - 无需创建 .edmx 的 Entity Framework

sql - 使用 Entity Framework 4.1 for Oracle 时,长列名会产生错误

c# - 将特殊字符分配给字符串时,Razor 页面会弄乱编码

c# - 将 PDF 转换为 PDF/A3 或将 PDF/A-1 转换为 PDF/A-3