1

EntityFrameworkを使用していくつかのレガシーテーブルをマップしようとしています。クラスは次のようになります...

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が含まれる住所に対応する「」が1つあります。CustomerReferenceCodeCustomer

それぞれCustomerに0個以上の" "があり、これは顧客のコードが含まれ、タイプフィールドにテキスト" "が含まれる場所ShipToAddressesに対応します。AddressesCustomerReferenceCodeShip-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

この例を参照してください(個別のクラスであることに注意してください):サブクラス関係を持つ流暢なNHibernate自動マップ継承

簡単なアプローチの1つは次のとおりです。

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)); }
}

追加のコメントが1つあります。これは、最初の例のように1つの請求先住所のビジネスロジックを暗黙的に強制するものではないため、上記のアプローチで他の場所に強制する必要があります。また、リンク先の例で説明されているように2つのクラスを作成し、TPHを使用することは、とにかく私が採用する可能性のあるアプローチです。これは、上記の目標を直接満たすものです。また、2つの間で、各プロパティのゲッターのディスクリミネーターを直接使用して、これが機能する場合があります。

于 2013-01-18T16:02:22.253 に答える