具有层次结构的EF Code First属性

时间:2015-06-04 11:54:16

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

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

model design

A类是一个抽象类,由A1和A2实现。此外,A类将导航属性navigationPropertyB暴露给B类,B类是由B1和B2实现的抽象类。

A类对象可以有一个B类对象,B可以在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&#39的navigationPropertyB模型。

有人可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

的引用
  

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

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

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

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