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

时间:2013-05-30 15:47:00

标签: nhibernate fluent-nhibernate

我的情况类似于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) :( 有没有办法做到这一点?我完全是以错误的方式解决这个问题吗?

1 个答案:

答案 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