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

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

c# - 流利的NHibernate-复合键上的HasMany-LMLPHP

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

最佳答案

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

关于c# - 流利的NHibernate-复合键上的HasMany,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19399882/

10-12 22:11