私はORMの中で(少なくともORMの)データベース構造を "クリーン"にしようとしています。流暢なNHibernateマッピング(条件付きで1対1)
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クラス(エンティティ)、顧客用とアドレスのための1つを作成しました:
テーブルの構造は次のようなものです。
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つだけの請求先住所と配送住所があるべきです。 はこれまでのところ、私の流暢クラスマップは、次のようになります。私もhasOneのを使用するかどう
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");
}
}
私はわからないんだけど...それは1つのマッピングのものでなければなりません。請求と発送を区別するために、そこに「where」節(I.E. WHERE Address.memberID = Members.customerID
)をどのようにして入手できますか?また、トップ1はどうですか?私はおそらくJoin
を使用することができますが、私はどこに句を追加するには流暢な関数が表示されない知っている。
データベース構造の変更は、残念ながらオプションではありません。
おかげ
ありがとう、私はそれを代わりに使用します...しかし、条件付きで参照できないと、それは私には役に立ちません。 –
"条件付きでアドレスを参照する"とはどういう意味ですか?わかりません。 –
請求先住所と配送先住所は同じテーブルに保存されています。これらを表すためにORMに異なるクラスを使用したいと考えています。そのためには、IsBillingビットフィールドに基づいて参照結合を行う必要があります。 –