EF4 DB-first:TPH方法?

时间:2011-04-21 17:12:12

标签: entity-framework-4 linq-to-entities ef-database-first database-first table-per-hierarchy

我知道这不应该是微不足道的,但到目前为止找不到决议......

使用EF4 DB-First模型,使用带有POCO的LINQ到实体,这些实体将被MVC3应用程序使用。

我有三个实体CustomerCustomerAdress和一个查找CustomerAddressType

Customer             CustomerAddress                  CustomerAddressType
----------           ----------------                 -------------------
CustomerId (PK)      CustomerAddressId (PK)           CustomerAddressTypeId (PK)
LastName             CustomerId (FK)                  Description (Values: Mailing, Billing)
FirstName            CustomerAddressTypeId (FK) 
MiddleInitial        Address
....                 City
                     State
                     Zip
                     StartDate
                     EndDate

正如您所看到的,CustomerAddress FK CustomerAddressTypeId,它标识了这是什么类型的地址,即邮件帐单

我想:

  • 能够执行以下操作:Customer.CustomerAddress.OfType<MailingAddress>以获取客户的邮寄地址集合。
  • 拥有CurrentMailingAddressCurrentBillingAddress属性,这些属性将在未来返回具有最高CustomerAddress.OfType<>StartDate的单个实例EndDate
  • 使用AddressZip属性并将这些属性重构为复杂类型 Address也很不错。

我尝试从CustomerAddress创建2个继承的实体(假设它是TPH [table-per-hierarchy]策略): MailingAddressBillingAddressCustomerAddressTypeId是歧视者。我在模型设计器中做了这个,并且当我尝试添加第二个继承的实体时,它告诉我具有这些名称的属性已经存在,并且不允许我重命名它们以匹配第一个实体的属性。 / p>

任何想法如何实现这一目标?请为我愚蠢:) 感谢!!!

1 个答案:

答案 0 :(得分:1)

这不是那么微不足道。 TPH是可能的,但您必须将所有属性放置到基础CustomerAddress并派生两个不包含任何属性的子实体,因为所有属性都是共享的(=必须在父级中)。您将使用CustomerAddressTypeId作为鉴别器,因此您将无法将此字段映射为实体中的属性。我也不确定你是否可以在鉴别器和关联映射中使用该字段(这对我来说实际上是很好的功课)。如果不是,您将无法映射CustomerAddressCustomerAddressType之间的关联。

CurrentMailingAddressCurrentBillingAddress都是计算属性,它们不是映射的一部分。您可以在Customer实体的部分部分中实现其逻辑。

我不理解Zip和复杂类型的最后一点。