实体框架 - 具有挑战性的设置包括多个主键,以及与外部表的多个关联

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 中,我在那里填充了各种地址。 那么 - 这有帮助吗?在那种情况下,很高兴我能帮上忙!

以上是关于实体框架 - 具有挑战性的设置包括多个主键,以及与外部表的多个关联的主要内容,如果未能解决你的问题,请参考以下文章

多个添加的实体可能在数据库种子上具有相同的主键

如何将实体框架用于具有多个客户端的应用程序

设置实体框架与非主键字段的一对一映射

实体框架将所有字段放在 Firebird 表的主键中

带有嵌套对象的实体框架数据插入,该对象具有一个请求的自动递增主键

如何在不违反主键约束的情况下插入具有循环引用的实体框架