2013-10-16 37 views
6

如何在傳統數據庫上創建HasMany關係,該關係沒有外鍵和列的不同名稱?我知道如何使用引用在HeaderVersion上創建一對一的關係,但不知道如何從頭1創建HasMany到* HeaderVersion。 加入條件應爲:Fluent NHibernate - HasMany on composite key

Header.Id1 = HeaderVersion.PId1 AND Header.Id2 = HeaderVersion.PId2 

Model http://i41.tinypic.com/30xbfo5.png

域:

public class Header { 
    public virtual int Id1 { get; set; } 
    public virtual int Id2 { get; set; } 
    public virtual string Something { get; set; } 
} 

public class HeaderVersion { 
    public virtual int PId1 { get; set; } 
    public virtual int PId2 { get; set; } 
    public virtual int Version { get; set; } 
    public virtual string SomethingFoo { get; set; } 
} 

地圖:

public HeaderMap() { 
     Table("Header"); 
     LazyLoad(); 
     CompositeId().KeyProperty(x => x.Id1, "Id1") 
        .KeyProperty(x => x.Id2, "Id2"); 
     Map(x => x.Something).Column("Something"); 
} 

public HeaderVersionMap() { 
     Table("HeaderVersion"); 
     LazyLoad(); 
     CompositeId().KeyProperty(x => x.PId1, "PId1") 
        .KeyProperty(x => x.PId2, "PId2") 
        .KeyProperty(x => x.Version, "Version"); 
     Map(x => x.SomethingFoo).Column("SomethingFoo"); 
} 

回答

4

假設Header是(省略替換值GetHashCodeEquals

public class Header 
{ 
    public virtual int Id1 { get; set; } 
    public virtual int Id2 { get; set; } 
    public virtual string Something { get; set; } 
    public virtual ICollection<HeaderVersion> Versions { get; set; } 
} 

HeaderMap應該是這樣的:

public class HeaderMap : ClassMap<Header> 
{ 
    public HeaderMap() 
    { 
     Table("Header"); 
     LazyLoad(); 
     CompositeId().KeyProperty(x => x.Id1, "Id1") 
        .KeyProperty(x => x.Id2, "Id2"); 
     Map(x => x.Something).Column("Something"); 
     HasMany(x => x.Versions).AsBag().KeyColumns.Add("PId1", "PId2"); 
     // Fetch, Inverse, Cascade depend on your mapping strategy 
    } 
} 
+0

我創建的hasMany關係,就像你說的之前(不含AsBag),但問題是,我沒有重寫GetHashCode和equals)。實施它們後,它像預期的那樣工作。謝謝。 – redman