2012-10-04 4 views
1

중개 테이블을 HasMany로 매핑하고 중개자와 HasOne을 자식으로 매핑하여이 문제를 해결했다고 생각했지만 HasOne은 키를 공유하려고합니다. (단, 역 옵션 :.)중간 테이블을 사용하는 일대 다 매핑

어쨌든, 관계형 구조는 내가이 없다 :

주소 (아동)

..Address 필드
을 AddressId
AddressCustomer (중개)
AddressCustomerId을
주소 고객 ID

고객 (부모)
고객 ID
..Customer 필드 나는 보통 1-많은 대신이 중개 테이블이 왜

? 주소를 포함해야하는 다른 엔티티가 있기 때문입니다. (즉, 사이트 등) 그들은 자신의 중개 테이블을 가지고있어 주소 테이블을 공유 할 수 있습니다.

매핑은 지금까지이 다음 CustomerAddress 테이블에 널 수 AddressId 열이

public class CustomerAddressMap : ClassMap<CustomerAddress> 
{ 
    public CustomerAddressMap() 
    { 
     Schema("dbo"); 
     Table("CustomerAddress"); 
     Id(x => x.CustomerAddressId); 
     Map(x => x.FromDate) 
      .Not.Nullable(); 
     Map(x => x.ToDate); 
     HasOne(x => x.Address) 
      .ForeignKey("AddressId") 
      .Cascade.All(); 
    } 

} 

public class AddressMap : ClassMap<Address> 
{ 
    public AddressMap() 
    { 
     Schema("dbo"); 
     Table("Address"); 
     Id(x=>x.AddressId); 
     Map(x => x.AddressType); 
    } 
} 

은 행이 다시 CustomerAddress까지 전달되지 않는 주소 행에서, 그러나 AddressID을 삽입됩니다. HasOne에는 Inverse 옵션이 없으므로 막 다른 길일 것입니다. SiteAddress와 같은 것을 추가하고 동일한 작업을 수행해야만 중복이 발생하기 때문에 CustomerAddress에서 생성 된 주소 ID를 가질 수 없습니다. 그 트릭 GUID를 키로 사용할 수 있지만 잠시 동안 자동 증가 Ints가 붙어 있습니다.

다른 아이디어는 CustomerAddress와 Address의 병합을 매핑하는 것이었지만 Fluent NHibby가 지원하지 않는다고 생각합니다.

누군가가 성공적으로 적용한 문제 도메인이라고 생각합니다. 본질적으로 나는 자식 테이블 (레코드가 아닌)이 여러 부모 사이에 공유되는 1-Many 관계를 원합니다. 어떤 아이디어?

+0

업데이트 : 여전히 완벽한 솔루션을 몇 일을 시도하지 후. AddressID를 GUID로 바꾸고, .HasOne() 대신 .Reference()를 설정했는데, CustomerAddress와 Site Address (작동 확인을 위해 추가)가 Address ID를 생성하는 책임을 맡았습니다. 그것은 작동하지만, 내가 GUID PK/FK에 주소 세부 사항을 허용하기 위해 바이 인을받을 수 있는지 확신하지 못합니다. 참조 또는 비슷한 주소를 생성 할 수있는 비슷한 해결책이있는 경우 자체 키를 생성하고이를 CustomerAddress/SiteAddress에서 업데이트해야합니다. 나는 기뻐할 것입니다. –

답변

1

지도를

public class CustomerAddressMap : ClassMap<CustomerAddress> 
{ 
    public CustomerAddressMap() 
    { 
     Table("CustomerAddress"); 

     Id(x => x.CustomerAddressId); 
     Map(x => x.FromDate).Not.Nullable(); 
     Map(x => x.ToDate); 
     References(x => x.Customer, "CustomerId"); 
     References(x => x.Address, "AddressId"); 
    } 
} 
+0

Aw man, int ID로 실제로 작동해야한다고 생각했던 방식으로 GUID로 작업하게하려면 아무렇지도 않게 작업해야한다고 생각하지 않았습니다. 감사 :) –

0

주소를 고객으로 일대 다 방식으로 만들지 않는 이유는 무엇입니까? 고객은 외래 키를 포함하고 주소 엔티티는 다른 엔티티가 참조 할 수 있습니다. 이 경우 고객 테이블에 References(x => x.Address);을 입력하기 만하면됩니다.
FluentNHibernate를 사용하여 일대일 관계를 만들려고 할 때도 공통적 인 문제에 직면했습니다.

public AddressMap() 
{ 
    Schema("dbo"); 
    Table("Address"); 
    Id(x => x.AddressId); 
    Map(x => x.AddressType); 
    HasOne(x => x.CustomerAddress).Cascade.All(); 
} 
public CustomerAddressMap() 
{ 
    Schema("dbo"); 
    Table("CustomerAddress"); 
    Id(x => x.CustomerAddressId); 
    Map(x => x.FromDate) 
     .Not.Nullable(); 
    Map(x => x.ToDate); 
    HasOne(x => x.Address) 
    .Constrained() 
    .ForeignKey(); 
} 

이러한 매핑 내 경우에는 한쪽 빈 왼쪽, 그래서 나는에 대한 속성 setter 수정 : 당신이 가리 켰을 때, 당신은 DB 구조를 마칠 경우에, 나는 당신이 (해당 개체의 필드를 추가하는) 다음과 같은 매핑을 시도해야 추측 하위 엔티티 (고객 주소) :

public virtual Address Address 
{ 
    get { return _address; } 
    set 
    { 
     _address = value; 
     value.CustomerAddress = this; 
    } 
} 

이러한 작업을 한 후에는 문제가 해결 될 수 있도록 도움이되기를 바랍니다.일반 참조로

관련 문제