2012-09-11 4 views
1
:

양쪽에 복합 키를 가진 일대 다 매핑에 문제가 있습니다. 여기 1 : 다수 매핑 : 유창한 NHibernate : 합성 ID들 :

public class OneSide 
{ 
    public virtual int A { get; set; }//-A,B,C,D together form primary key 
    public virtual int B { get; set; } 
    public virtual int C { get; set; } 
    public virtual int D { get; set; } 
    public virtual int OtherData { get; set; } 
    public virtual IList<ManySide> Ls { get; set; } 
} 

public class OneSideMap : ClassMap<OneSide> 
{ 
    public OneSideMap() 
    { 
     LazyLoad(); 

     CompositeId().KeyProperty(x => x.A).KeyProperty(x => x.B).KeyProperty(x => x.C).KeyProperty(x => x.D); 

     Map(x => x.OtherData).Not.Nullable(); 
     HasMany(x => x.Ls).KeyColumns.Add("A", "B", "C", "D").Inverse().Cascade.All(); 
    } 
} 

public class ManySide 
{ 
    public virtual OneSide OneSide { get; set; } 
    public virtual int A { get; set; }//-A,B,C,D,E together form primary key 
    public virtual int B { get; set; } 
    public virtual int C { get; set; } 
    public virtual int D { get; set; } 
    public virtual int E { get; set; } 
    public virtual int OtherData2 { get; set; } 
} 

public class ManySideMap : ClassMap<ManySide> 
{ 
    public ManySideMap() 
    { 
     LazyLoad(); 

     CompositeId().KeyReference(x => x.A).KeyReference(x => x.B).KeyReference(x => x.C).KeyReference(x => x.D).KeyProperty(x => x.E); 

     Map(x => x.OtherData2).Not.Nullable(); 
     References(x => x.OneSide).Columns("A", "B", "C", "D").Cascade.All(); 
    } 
} 

데이터베이스 구조입니다 :

table: OneSide: 
int A; 
int B; 
int C; 
int D; 
int OtherData; 

table: ManySide: 
int A; 
int B; 
int C; 
int D; 
int E; 
int OtherData2; 

나는 그것이 정확하지 알고 난으로 무엇이 잘못되었는지 생각에서 지금이야 여기

는 내가 지금까지 무엇을 가지고 몇 시간 전에 NHibernate를 배우기 시작했습니다. 누군가 내 코드에서 잘못된 점을 지적 할 수 있습니까?

답변

0

열을 두 번 매핑 할 수 없기 때문에 oneSide에 대한 참조가 keyreference 여야합니다. ManySide에서

public class ManySideMap : ClassMap<ManySide> 
{ 
    public ManySideMap() 
    { 
     LazyLoad(); 

     CompositeId() 
      .KeyReference(x => x.OneSide, "A", "B", "C", "D") 
      .KeyProperty(x => x.E); 

     Map(x => x.OtherData2).Not.Nullable(); 
    } 
} 

액세스 열 B는 manysideObj.OneSide.B만큼 간단하고 당신이 유일한 접근로 그 기본 키를 형성 한 쪽의 특성도 OneSide를로드 할 수 없습니다.