2013-10-16 7 views
6

Wie erstellen Sie eine HasMany-Beziehung auf einer Legacy-Datenbank, die keinen Fremdschlüssel und Spalten anders benannt hat? Ich weiß, wie man eine One-to-One-Beziehung auf HeaderVersion mit Referenzen erstellt, aber nicht wissen, wie man HasMany von Header 1 zu * HeaderVersion erstellen. Joinbedingung sollte sein:Fließend NHibernate - HasMany auf zusammengesetzten Schlüssel

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

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

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

Karte:

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

Antwort

4

Unter der Annahme Header ist (unterlassener Überschreibungen für GetHashCode und 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 sollte wie folgt aussehen:

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

I HasMany Beziehung erstellt wie Sie gesagt haben, bevor (ohne AsBag), aber das Problem war, dass ich nicht GetHashCode habe außer Kraft setzen und Equals). Nach der Implementierung funktioniert es wie erwartet. Vielen Dank. – redman