Free NHibernate - HasMany on a composite key

How to create a HasMany relationship in an outdated database that does not have a foreign key and columns with different names? I know how to create a one-to-one relationship in HeaderVersion using References, but I don’t know how to create HasMany from Header 1 in * HeaderVersion. The condition for joining should be:

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

Model

Domain:

 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; } } 

Map:

  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"); } 
+6
source share
1 answer

Assuming Header (omitted overrides for GetHashCode and Equals )

 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 should look like this:

 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 } } 
+4
source

Source: https://habr.com/ru/post/956070/


All Articles