Entity framework 4 EF4 DB优先:TPH方法?

Entity framework 4 EF4 DB优先:TPH方法?,entity-framework-4,linq-to-entities,ef-database-first,database-first,table-per-hierarchy,Entity Framework 4,Linq To Entities,Ef Database First,Database First,Table Per Hierarchy,我知道这不应该是小事,但到目前为止还没有找到解决方案 使用EF4 DB First模型,使用LINQ to实体和将由MVC3应用程序使用的POCO 我有三个实体Customer,customerAddress和一个查找CustomerAddressType Customer CustomerAddress CustomerAddressType ---------- ----------------

我知道这不应该是小事,但到目前为止还没有找到解决方案

使用EF4 DB First模型,使用LINQ to实体和将由MVC3应用程序使用的POCO

我有三个实体
Customer
customerAddress
和一个查找
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
    ,以获取客户的邮件地址集合
  • 具有一个
    CurrentMailingAddress
    CurrentBillingAddress
    属性,该属性将返回类型为
    的单个实例
    CustomerAddress.OfType,并且将来具有最高的
    StartDate
    EndDate
  • 通过
    Zip
    属性获取
    Address
    并将这些属性重构为复杂类型
    Address
    ,也会很好
我尝试使用
CustomerAddress
创建2个继承实体(假设它是TPH[每个层次结构的表]策略):
MailingAddress
BillingAddress
CustomerAddressTypeId
作为鉴别器。我在模型设计器中这样做了,当我尝试添加第二个继承实体时,它告诉我具有这些名称的属性已经存在,并且不允许我重命名它们以匹配第一个实体的属性

有没有办法做到这一点?请帮我把话说清楚:)
谢谢

这并不是那么简单。TPH是可能的,但您必须将所有属性放置在基本
CustomerAddress
中,并派生两个子实体,因为所有属性都是共享的(=必须在父级中),所以它们不会包含任何属性。您将使用
CustomerAddressTypeId
作为鉴别器,因此无法将此字段映射为实体中的属性。我也不确定你是否可以在鉴别器和关联映射中同时使用这个字段(这对我来说是个不错的家庭作业)。否则,您将无法映射
CustomerAddress
CustomerAddressType
之间的关联

CurrentMailingAddress
CurrentBillingAddress
都是计算属性,它们不是映射的一部分。由您在
Customer
实体的部分实现他们的逻辑


我不明白邮政编码和复杂类型的最后一点。

谢谢你,拉迪斯拉夫。我想我会从回复你的帖子开始1)
地址
城市
邮政编码
-我想重构成一个复杂的类型,但不确定它是否会让我一路悲伤(我想应该可以)。2) 我之所以提到Current*Address,是因为我想利用CustomerAddress.OfType。3) 我会试一试,让你知道我是怎么做的。好的,我用基本类型创建了两个实体
CustomerBillingAddress
customermaingaddress
。使用适当的值将表映射设置为每个实体的
CustomerAddress
和鉴别器列
CustomerAddressTypeId
。然后,当我去验证模型时,我得到了以下错误:
error 1 error 3023:映射从第1146、1169、1175行开始的片段时出现问题:Column customeraddress.AddressTypeId没有默认值,并且不可为null。存储实体数据需要列值。当:(PK位于“CustomerAddresses”EntitySet中且实体类型为[Entities.CustomerAddress])时,具有密钥(PK)的实体将不会往返。
。我尝试从基本实体
CustomerAddress
中删除鉴别器列“CustomerAddressTypeId”,从而中断了与
CustomerAddressType
的关系,仍然显示相同的消息。好的,我想我解决了模型验证错误。。。必须:1)在实体
CustomerAddress
上,将属性更改为Abstract:True(以创建抽象类);2) 删除实体
CustomerAddressType
;3) 从基本实体中删除鉴别器列
CustomerAddressTypeId
。还没有机会在代码中验证一切是否正常,但很快就会发布。好的,我终于能够验证了,它是有效的,但是Ladislav,正如你提到的,我不能让
CustomerAddressTypeId
同时成为关联和鉴别器。所以我不得不失去联系,这没什么大不了的。