功能NHibernate - 复合键的hasMany [英] Fluent NHibernate - HasMany on composite key

查看:250
本文介绍了功能NHibernate - 复合键的hasMany的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你如何创建一个没有外键和列的遗留数据库上的hasMany关系不同的名称?我知道了如何使用引用的HeaderVersion一比一的关系,但不知道如何创建的hasMany从标题1 * HeaderVersion。
加入条件应该是:



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



域:

 公共类头{
酒店的公共虚拟INT为Id1 {搞定;组; }
公共虚拟INT型Id2 {搞定;组; }
公共虚拟字符串的东西{搞定;组; }
}

公共类HeaderVersion {
公共虚拟INT PID1 {搞定;组; }
公共虚拟INT PID2 {搞定;组; }
公共虚拟INT版本{搞定;组; }
公共虚拟字符串SomethingFoo {搞定;组; }
}



图:

 公共HeaderMap(){
表(头);
LazyLoad();
CompositeId()KeyProperty(X => x.Id1,ID1)
.KeyProperty(X => x.Id2,ID2);
地图(X => x.Something).Column(东西);
}

公共HeaderVersionMap(){
表(HeaderVersion);
LazyLoad();
CompositeId()KeyProperty(X => x.PId1,PID1)
.KeyProperty(X => x.PId2,PID2)
.KeyProperty(X = > x.Version,版本);
地图(X => x.SomethingFoo).Column(SomethingFoo);
}


解决方案

假设标题终止(略替换值的GetHashCode 等于

 公共类的头
{
公共虚拟INT为Id1 {搞定;组; }
公共虚拟INT型Id2 {搞定;组; }
公共虚拟字符串的东西{搞定;组; }
公共虚拟的ICollection< HeaderVersion>版本{搞定;组; }
}



HeaderMap 应是这样的:

 公共类HeaderMap:ClassMap<页眉和GT; 
{
公共HeaderMap()
{
表(头);
LazyLoad();
CompositeId()KeyProperty(X => x.Id1,ID1)
.KeyProperty(X => x.Id2,ID2);
地图(X => x.Something).Column(东西);
的hasMany(X => x.Versions).AsBag()KeyColumns.Add(PID1,PID2);
//取,反,级联取决于你的映射策略
}
}


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

解决方案

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

这篇关于功能NHibernate - 复合键的hasMany的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆