【问题标题】:EF Code First property with hierarchy具有层次结构的 EF Code First 属性
【发布时间】:2015-06-05 01:18:19
【问题描述】:

在使用 Entity Framework Code First 6 时,我正在尝试复制以下模型:

A 类是一个抽象类,由 A1 和 A2 实现。此外,A 类向 B1 和 B2 实现的抽象类 B 公开了一个导航属性 navigationPropertyB。

A 类对象可以有一个 B 类对象,B 可以多次参与 A 类实例。

目前对于 A,我使用的是 Table per Hierarchy,对于 B,我使用的是 Table per Concrete Type

A 类层次结构已正确映射,并且正在使用以下映射:

    modelBuilder.Entity<A>()
                .Map<A1>(m => m.Requires("AType").HasValue((int)AType.A1))
                .Map<A2>(m => m.Requires("AType").HasValue((int)AType.A2))

我知道这是一个类似的概念,但我很难获得到模型 A 的 navigationPropertyB 的有效映射。

谁能帮忙?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    您正在尝试在AB 之间创建一对多关系,因为每个B 都可能与多个As 建立关系。这里的一个问题是,由于您为B 的层次结构使用按具体类型(TPC)继承的表,因此您将无法在AB 层次结构中的类之间创建单个关联.这是来自您linked article on TPC 的引述:

    ...SQL 模式不知道继承;实际上,我们已经将两个不相关的表映射到一个更具表现力的类结构......我必须强调,数据库表之间没有任何关系,除了它们共享一些相似的列。

    换句话说,使用 TPC,由于类型不共享一个表,因此B 的层次结构中的实体之间可能存在重复的键值!

    因此,如果您想在 AB 之间创建关联,则需要

    • B 层次结构中的每个具体类型创建单独的关联
    • 将继承映射更改为 TPH 或 TPT

    【讨论】:

    • 您好 jjj,感谢您的回答。我仍然更赞成 TPC,所以你的第一个选择似乎不错。我对 B 模型的想法是 B(Id, Type), B1(Id, ...), B2(Id,...) 和 A 将链接到表 B。这是您的第一个选择吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2013-06-02
    • 2017-06-26
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多