Fluent NHibernate - HasMany on composite key

邮差的信 提交于 2019-12-22 06:27:22

问题


How do you create a HasMany relation on a legacy database which has no Foreign Key and columns differently named? I know how to create a one-to-one relation on HeaderVersion using References, but don't know how to create HasMany from Header 1 to * HeaderVersion. Join condition should be:

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

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

回答1:


Assuming Header is (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 :

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


来源:https://stackoverflow.com/questions/19399882/fluent-nhibernate-hasmany-on-composite-key

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!