我的情况类似于Fluent NHibernate Mapping not on PK Field
中描述的情况但是,我的表之间的关系由多个非主键列描述。
想象一下Chris Meek的情况,但是Person
有一个JobType
和一个Code
,应该(抱歉,这是一个遗留数据库)唯一地描述一个{ {1}}
Person
SerhatÖzgel的answer描述了使用Person
------
Id PK
JobType
Code
Name
Order
-----
Id PK
Person_JobType
Person_Code
OrderDetails
,但我找不到为多列单独执行此操作的方法。我尝试过类似的
PropertyRef
但这显然不起作用,因为class PersonMap : ClassMap<Person>
{
public PersonMap()
{
HasMany(p => p.Order)
.KeyColumns.Add("Person_JobType")
.PropertyRef("JobType")
.KeyColumns.Add("Person_Code")
.PropertyRef("Code")
}
}
会返回另一个KeyColumns.Add()
,因此OneToManyPart
不会针对要添加的单个列运行。第二个PropertyRef()
只是覆盖了第一个,我得到以下错误:
PropertyRef()
我查看了KeyColumns.Add(),
的各种重载NHibernate.MappingException : collection foreign key mapping
has wrong number of columns: MyApp.Person.Order type: Int32
特别是最后两个,但找不到任何方法为每列单独设置public TParent Add(string name)
public TParent Add(params string[] names)
public TParent Add(string columnName, Action<ColumnPart> customColumnMapping)
public TParent Add(ColumnMapping column)
:(
有没有办法做到这一点?我完全是以错误的方式解决这个问题吗?
答案 0 :(得分:3)
使用hbm.xml和FluentNHibernate可以使用技巧
class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Map(_ => JobTypeAndCode)
.Columns.Add("Person_JobType", "Person_Code")
.ReadOnly()
.LazyLoad() // optional: prevent loading the Columns twice
.Access.None();
HasMany(p => p.Orders)
.KeyColumns.Add("Person_JobType", "Person_Code")
.PropertyRef("JobTypeAndCode")
}
private object JobTypeAndCode { get; set; } // FakeProperty
}
注意:我从来没有使用NHibernate MappingByCode