저의 ORM에서 잘못 설계된 데이터베이스 구조를 "정리"하려고합니다. Fluent NHibernate Mapping (조건부 일대일)
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 청구 및 배송 주소입니다. 지금까지, 내 유창 classmap은 다음과 같습니다 심지어 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");
}
}
잘 모르겠어요 ... 그것은 하나의 매핑에 하나 여야합니다. 청구서 발송과 배송을 구별하기 위해 "where"절 (I.E. WHERE Address.memberID = Members.customerID
)을 어떻게 얻을 수 있습니까? 또한 상위 1 위는 무엇입니까? Join
을 사용할 수는 있지만 where 절을 추가하는 유창한 함수는 없다는 것을 알고 있습니다.
데이터베이스 구조를 수정하는 것은 불행히도 옵션이 아닙니다.
감사
감사합니다. 대신 그 주소를 참조 할 필요없이 조건부로 주소를 참조 할 수 있습니다. –
"조건부로 주소 참조"란 무엇을 의미합니까? 나는 이해하지 못한다. –
청구서 발송 주소는 동일한 테이블에 저장되어 있으며 ORM에 다른 클래스를 사용하여이를 나타냅니다. 이를 위해서는 IsBilling 비트 필드를 기반으로 참조 조인이 필요합니다. –