【问题标题】:EntityFramework Many to ManyEntityFramework 多对多
【发布时间】: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 表没有主键。将ProjectIdTaskId 设为该表的复合主键。
  • ProjectTask 需要有一个 PK 是 ProjectIdTaskId 的复合键,而不是它自己的 Id 字段.....
  • @Claies 如果第三个表是由代码优先迁移生成的,那么这不是真正必要的,那么 EF 迁移将创建第三个定义了复合键的表。
  • 这是数据库优先,但我认为 EF 能够推断行唯一性,因为 ProjectTask 使用外键约束来引用两列的主键;但是,似乎 EF 并不那么聪明。我向 ProjectTask 添加了一个复合 PK(不幸的是,它是多余的并且可能会降低性能)但 EF 现在可以工作了。这对我来说似乎是一个糟糕的解决方案,我会继续寻找更好的解决方案!
  • 可以修改 Database First 生成的模型并删除 DefiningQuery,即使没有 PK,Entity Framework 也可以使用连接表。但是,如果没有复合 PK,可能会使连接表进入不一致状态,并导致 EF 在运行时崩溃。机会很低,并且需要手动修改表,但它就在那里。此外,如果模型被重新搭建,修改模型可能会被撤消。

标签: c# entity-framework entity-framework-6


【解决方案1】:

正如一些人提到的。解决方案是在 ProjectTask 表上创建复合键。

ALTER TABLE dbo.ProjectTask
    ADD CONSTRAINT ProjectTask_ProjectId_TaskId UNIQUE (ProjectId, TaskId)

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多