1

設計が不十分なデータベース構造を「クリーン」にしようとしています (少なくとも私の ORM では)。

テーブル構造は次のようなものです。

Table: Members
memberID (int PK)
username (varchar)

Table: Addresses
addressID (int PK)
memberID (int, not set as a FK - awesome)
firstName (varchar)
lastName (varchar)
addressLine1 (varchar)
isBillingAddress (bit)

そこで、顧客用と住所用の 2 つのクラス (エンティティ) を作成しました。

public class Customer
{
    public virtual int CustomerID { get; set; }
    public virtual string FirstName
    {
        get { return BillingAddress.FirstName; }
        set { BillingAddress.FirstName = value; }
    }
    public virtual string LastName
    {
        get { return BillingAddress.LastName; }
        set { BillingAddress.LastName = value; }
    }
    public virtual Address BillingAddress { get; set; }
    public virtual Address ShippingAddress { get; set; }
}

public class Address
{
    public virtual Customer Customer { get; set; }
    public virtual int AddressID { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string AddressLine1 { get; set; }
    public virtual string AddressLine2 { get; set; }
    public virtual string City { get; set; }
    public virtual string State { get; set; }
    public virtual string PostalCode { get; set; }
}

顧客の請求先住所を取得するクエリは次のようになります。

SELECT TOP 1 *
FROM dbo.Address
WHERE isBilling = 1
AND memberID = @memberID

請求先住所と配送先住所は、顧客ごとに 1 つのみにする必要があります。これまでのところ、流暢なクラスマップは次のようになります。

public class CustomerMapping : ClassMap<Customer>
{
    public CustomerMapping()
    {
        Table("Members");

        Id(m => m.CustomerID).Column("memberID");
        Map(m => m.BillingAddress);

        HasOne(x => x.BillingAddress).PropertyRef("memberID");
        HasOne(x => x.ShippingAddress).PropertyRef("memberID");
    }
}

HasOne を使用する必要があるかどうかもわかりません... 1 対 1 のマッピングである必要があります。WHERE Address.memberID = Members.customerID請求と配送を区別するために、「where」節 (IE) を取得するにはどうすればよいですか? また、トップ1はどうですか?Join使用できることはわかっていますが、where句を追加するための流暢な関数が表示されません。

残念ながら、データベース構造を変更することはできません。

ありがとう

4

1 に答える 1

1

正しいように聞こえますが、HasOne() は必要ありません。HasOne() は、テーブルが主キーを共有することを意味します。代わりに References() を使用してください。

于 2010-12-02T05:03:46.617 に答える