2012-09-11 22 views
1

我在使用一對多複合關鍵字進行一對多映射時遇到了問題。使用複合ID在流暢NHibernate中進行一對多映射

這是我到目前爲止有:

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的引用必須是關鍵引用,因爲您無法將列映射兩次。從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。

相關問題