1

我正在尝试使用实体框架映射几个遗留表。课程看起来像这样......

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客户引用集合。

4

1 回答 1

1

看这个例子(注意它是单独的类):Fluent NHibernate automap inherit 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 中使用鉴别器。

于 2013-01-18T16:02:22.253 回答