1

저의 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 절을 추가하는 유창한 함수는 없다는 것을 알고 있습니다.

데이터베이스 구조를 수정하는 것은 불행히도 옵션이 아닙니다.

감사

답변

1

그것은 바로 소리하지만 당신이하는 hasOne의()를 원하지 않는다. HasOne()은 테이블이 기본 키를 공유 함을 의미합니다. 참조()를 대신 사용하십시오.

+0

감사합니다. 대신 그 주소를 참조 할 필요없이 조건부로 주소를 참조 할 수 있습니다. –

+0

"조건부로 주소 참조"란 무엇을 의미합니까? 나는 이해하지 못한다. –

+0

청구서 발송 주소는 동일한 테이블에 저장되어 있으며 ORM에 다른 클래스를 사용하여이를 나타냅니다. 이를 위해서는 IsBilling 비트 필드를 기반으로 참조 조인이 필요합니다. –