在多个非PK字段上的流畅NHibernate映射

mo.*_*mo. 5 nhibernate fluent-nhibernate

我的情况类似于Fluent NHibernate Mapping中描述的情况,而不是PK Field

但是,我的表之间的关系由多个非主键列描述.想象一下克里斯·米克的情况,但是Person有一个JobType和一个Code一起应该(对不起,它是一个遗留数据库)唯一描述一个Person

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

Order
-----
Id PK
Person_JobType
Person_Code
OrderDetails
Run Code Online (Sandbox Code Playgroud)

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这显然是行不通的,因为KeyColumns.Add()返回另一个OneToManyPart所以PropertyRef()添加未对个人柱.第二个PropertyRef()只是覆盖第一个,我得到以下错误:

NHibernate.MappingException : collection foreign key mapping
has wrong number of columns: MyApp.Person.Order type: Int32
Run Code Online (Sandbox Code Playgroud)

我查看了KeyColumns.Add()的各种重载,

public TParent Add(string name)
public TParent Add(params string[] names)
public TParent Add(string columnName, Action<ColumnPart> customColumnMapping)
public TParent Add(ColumnMapping column)
Run Code Online (Sandbox Code Playgroud)

特别是最后两个,但找不到任何方法PropertyRef为每列设置单独的级别:(有没有办法做到这一点?我完全是错误的方式吗?

Fir*_*iro 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
}
Run Code Online (Sandbox Code Playgroud)

注意:我从未使用 NHibernate MappingByCode 让它工作