流畅的NHibernate – HasMany复合键

如何在没有外键和列名不同的旧数据库上创建HasMany关系? 我知道如何使用References在HeaderVersion上创建一对一的关系,但不知道如何从Header 1到* HeaderVersion创建HasMany。 加入条件应该是:

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

型号http://sofzh.miximages.com/c%23/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"); } 

假设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 Versions { get; set; } } 

HeaderMap应如下所示:

 public class HeaderMap : ClassMap
{ 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 } }