【问题标题】:Entity Framework Association with Non Key fields与非关键字段的实体框架关联
【发布时间】:2017-10-16 13:37:12
【问题描述】:

是否可以在实体框架中创建关联 b/t 2 非关键字段?

示例:获取旧应用程序中的 2 个表(即键/结构不能更改)

Order (
    OrderId : int : PK
    OrderNo : varchar
)

OrderDetails (
    DetailRecordId : int : PK
    OrderNo : varchar
)

在实体框架中,我想通过 OrderNo 字段创建一个关联 b/t OrderOrderDetails,该字段既不是表上的主键,也不是数据库中的 FK 关系。

在我看来,这不仅应该很容易做到,而且是使用 EF 之类的东西的一个原因。但是,它似乎只想允许我使用实体键创建关联。

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    实体框架允许您声明列是键,并且在数据库中实际不存在 FK 约束的地方存在 FK 约束。

    那是因为 SSDL(EDMX 的 StorageModel 部分)可以在必要时被您操纵,并且对数据库撒谎

    然后,EF 将与数据库交互,就好像键和外键确实存在一样。

    这应该可行,但有关参照完整性的所有正常警告都适用。

    见我的Entity Framework Tips

    希望这会有所帮助。

    【讨论】:

    • +1 那么这是否意味着我必须手动编辑 thge .edmx 文件?
    • 再次感谢。最后一个问题。如果我确实编辑了 EDMX,当我想使用向导更新模型时,它将如何工作?我的自定义更改是否会保留,或者一旦我开始“编辑 EDMX”路线,我是否必须手动进行所有更改?
    • 不幸的是,当您从数据库刷新模型时,EDMX 的 SSDL 部分中的更改会被覆盖。所以是的,您将需要再次进行更改。但是,如果您使用设计器修改概念模型的工具,则不应触及您的自定义 SSDL 位。
    【解决方案2】:

    使用非键字段来定义关系的问题是键不能保证正确导航。这可能会导致您在两个实体之间存在一对一关系,其中存在多个可能的行来满足该关系。

    ...当关联数据库中的数据时,关系应始终基于键。密钥强制参照完整性。

    【讨论】:

    • 问题是它是否允许。假设我 100% 确定这不会发生……EF 是否允许我建立这种关系,即使这显然不是好的做法?
    【解决方案3】:

    另一种解决方法:

    创建不包含 PK 的视图 vOrder 并从中创建实体。 将此实体中的 PK 设置为 OrderNo

    现在您可以创建关联了

    【讨论】:

      猜你喜欢
      • 2020-03-15
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      相关资源
      最近更新 更多