实体框架 - 具有挑战性的设置包括多个主键,以及与外部表的多个关联
Posted
技术标签:
【中文标题】实体框架 - 具有挑战性的设置包括多个主键,以及与外部表的多个关联【英文标题】:Entity Framework - Challenging setup includes multiple primary keys, and multiple associations to foreign table 【发布时间】:2013-01-18 14:28:31 【问题描述】:我正在尝试使用实体框架映射几个旧表。这些类看起来像这样......
public class Customer
[Key, Required]
public string Code get; set;
public string Domain get; set;
public virtual Address BillToAddress get; set;
public virtual ICollection<Address> ShipToAddresses get; set;
public class Address
[Column(Order = 0), Key, Required]
public string Code get; set;
[Column(Order = 1), Key, Required]
public string Domain get; set;
public string Type get; set;
public string CustomerReferenceCode get; set;
每个客户都有一个“BillToAddress
”与地址对应,该地址的CustomerReferenceCode
包含客户代码,并且类型字段包含文本“Customer
”
每个Customer
有零个或多个“ShipToAddresses
”对应于Addresses
,其CustomerReferenceCode
包含客户代码,其类型字段包含文本“Ship-To
”
我可以通过添加来引用BillToAddress
[Key, Required]
[ForeignKey("BillToAddress"), Column(Order = 1)]
public string Code get; set;
[ForeignKey("BillToAddress"), Column(Order = 2)]
public string Domain get; set;
但我一直无法弄清楚如何为客户引用ShipToAddresses
的集合。
【问题讨论】:
【参考方案1】:查看这个例子(注意它是单独的类):Fluent NHibernate automap inheritance with subclass relationship
一种简单的方法可能是:
public class Customer
[Key, Required]
public string Code get; set;
public string Domain get; set;
public virtual ICollection<Address> Addresses get; set;
public virtual Address BillToAddress get Addresses.Where(n=>n.Type = Address.BillingAddress)).Single();
public virtual ICollection<Address> ShipToAddresses get Addresses.Where(n=>n.Type = Address.ShipToAddress));
另外一个评论 - 这并不像您开始的示例那样隐式地强制您的一个帐单地址业务逻辑,因此您需要在其他地方使用上述方法强制执行。此外,创建两个类并使用我链接到的示例中描述的 TPH 是我无论如何都可能采用的方法 - 这将直接满足您在上面描述的目标。此外,在两者之间,这可能会起作用,直接在每个属性的 getter 中使用鉴别器。
【讨论】:
这是一个相当直接的解决方案。我们确实对 EF 上下文的模型和查询进行了相当严格的分离。现在,我正在实现一些非常相似的东西......在调用客户的基本 iqueryable 中,我在那里填充了各种地址。 那么 - 这有帮助吗?在那种情况下,很高兴我能帮上忙!以上是关于实体框架 - 具有挑战性的设置包括多个主键,以及与外部表的多个关联的主要内容,如果未能解决你的问题,请参考以下文章