第一:TPH方法?
我知道这不应该是微不足道的,但到目前为止找不到解决方案...
使用EF4 DB-First模型,使用LINQ-to-Entities和POCO,MVC3应用程序将使用它们。
我有三个实体Customer , CustomerAdress和一个查找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>来获取客户的邮寄地址的集合。 CurrentMailingAddress和CurrentBillingAddress属性,它将在未来以最高的StartDate和EndDate返回单个实例CustomerAddress.OfType<> 。 Address通过Zip属性并将这些属性重构为一个复杂类型Address也很好。 我尝试从CustomerAddress创建2个继承实体(假设它是TPH [table-per-hierarchy]策略): MailingAddress和BillingAddress , CustomerAddressTypeId是鉴别器。 我在模型设计器中这样做了,当我尝试添加第二个继承实体时,它告诉我具有这些名称的属性已经存在,并且不会让我重命名它们以匹配第一个实体的属性。
任何想法如何做到这一点? 请为我贬低它:)谢谢!
这并不是那么微不足道。 TPH将成为可能,但您必须将所有属性放在基本CustomerAddress并派生出两个不包含任何属性的子实体,因为所有属性都是共享的(=必须在父级中)。 您将使用CustomerAddressTypeId作为鉴别器,因此您将无法将该字段映射为实体中的属性。 我也不确定你是否可以在辨别器和关联映射中都有这个领域(对我来说这实际上是很好的作业)。 如果没有,您将无法映射CustomerAddress和CustomerAddressType之间的关联。
CurrentMailingAddress和CurrentBillingAddress都是计算属性,它们不是映射的一部分。 您需要在您的Customer实体的部分实施其逻辑。
我不明白Zip和复杂类型的最后一点。
上一篇: first: TPH approach?
