多个非PK字段上的Fluent NHibernate映射

多个非PK字段上的Fluent NHibernate映射,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我的情况与中描述的类似 但是,我的表之间的关系由多个非主键列描述。 想象一下Chris Meek的情况,但是一个人有一个工作类型和一个代码,这两者加起来应该(抱歉,这是一个遗留数据库)唯一地描述一个人 Person ------ Id PK JobType Code Name Order ----- Id PK Person_JobType Person_Code OrderDetails SerhatÖzgel描述了如何使用PropertyRef,但我找不到一种方法来分别为多个列执行该操作

我的情况与中描述的类似

但是,我的表之间的关系由多个非主键列描述。 想象一下Chris Meek的情况,但是一个
有一个
工作类型
和一个
代码
,这两者加起来应该(抱歉,这是一个遗留数据库)唯一地描述一个

Person
------
Id PK
JobType
Code
Name

Order
-----
Id PK
Person_JobType
Person_Code
OrderDetails
SerhatÖzgel描述了如何使用
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()的各种重载

public TParent Add(字符串名称)
公共TParent Add(参数字符串[]名称)
公共TParent Add(字符串columnName、操作customColumnMapping)
公共t租金添加(列映射列)
特别是最后两个,但找不到任何方法为每个列分别设置
PropertyRef
级别:(
有没有办法做到这一点?我是不是完全走错了方向?

使用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
}
classpersonmap:ClassMap
{
公众人物地图()
{
映射(=>JobTypeAndCode)
.列。添加(“人员工作类型”、“人员代码”)
.ReadOnly()
.LazyLoad()//可选:防止两次加载列
.Access.None();
有很多(p=>p订单)
.KeyColumns.Add(“人员工作类型”、“人员代码”)
.PropertyRef(“作业类型和代码”)
}
私有对象JobTypeAndCode{get;set;}//FakeProperty
}

注意:我从来没有使用NHibernate MappingByCode实现过这一点。哇,太好了。我最终所做的就是在这些类之间没有NHibernate映射,只是提取值并在必要时将它们扔回另一个类的存储库以获得适当的记录。这太难看了。我希望我知道你上一次的技巧ek:)这是我在尝试这种方法时遇到的错误(无法通过):任何映射都不能构成属性的一部分-ref@VishalKumar最好问一个问题并发布一些代码?看起来propertyref的属性是referenceAny而不是Map@firo这个答案有一个主要缺点。父表中列的原始类型已损坏。有人知道如何修复它吗?@LeoY什么意思?我想我已经测试过了,效果不错。
public TParent Add(string name)
public TParent Add(params string[] names)
public TParent Add(string columnName, Action<ColumnPart> customColumnMapping)
public TParent Add(ColumnMapping column)
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
}