功能NHibernate - 复合键的hasMany [英] Fluent NHibernate - HasMany on composite key
本文介绍了功能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屋!
查看全文