【发布时间】:2015-05-03 16:27:10
【问题描述】:
自从升级到 EF 6.1.3 后,我无法将任何内容保存到 DB。
我收到一个错误:
“无法更新 EntitySet 'ProjectTask',因为它有一个 DefiningQuery 并且元素中不存在支持当前操作的元素。”
表格定义了多对多关系:
项目
- Id INT PK
项目任务
- ProjectId INT
- TaskId INT
任务
- Id INT PK
定义了所有外键。很标准。
一些帖子指出连接表ProjectTask 必须定义一个主键。但是,如果我这样做,EF 会在数据模型中创建 ProjectTask 类,这是不好的。
【问题讨论】:
-
您的
ProjectTask表没有主键。将ProjectId和TaskId设为该表的复合主键。 -
ProjectTask需要有一个 PK 是ProjectId和TaskId的复合键,而不是它自己的Id字段..... -
@Claies 如果第三个表是由代码优先迁移生成的,那么这不是真正必要的,那么 EF 迁移将创建第三个定义了复合键的表。
-
这是数据库优先,但我认为 EF 能够推断行唯一性,因为 ProjectTask 使用外键约束来引用两列的主键;但是,似乎 EF 并不那么聪明。我向 ProjectTask 添加了一个复合 PK(不幸的是,它是多余的并且可能会降低性能)但 EF 现在可以工作了。这对我来说似乎是一个糟糕的解决方案,我会继续寻找更好的解决方案!
-
您可以修改 Database First 生成的模型并删除
DefiningQuery,即使没有 PK,Entity Framework 也可以使用连接表。但是,如果没有复合 PK,可能会使连接表进入不一致状态,并导致 EF 在运行时崩溃。机会很低,并且需要手动修改表,但它就在那里。此外,如果模型被重新搭建,修改模型可能会被撤消。
标签: c# entity-framework entity-framework-6