5

Fluent NHibernate Mapping not on PK Fieldで説明されている状況と同様の状況があります

ただし、私のテーブル間の関係は、複数の非主キー列によって記述されています。Chris Meek の状況を想像してみてください。ただし、aPersonには aJobTypeと aCodeがあり、一緒にすると(申し訳ありませんが、これは古いデータベースです)、a を一意に記述する必要があります。Person

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()別のものを返すOneToManyPartためPropertyRef()、追加されている個々の列に対して実行されていないからです。2つ目PropertyRef()は最初のものを上書きするだけで、次のエラーが発生します。

NHibernate.MappingException : collection foreign key mapping
has wrong number of columns: MyApp.Person.Order type: Int32

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)

具体的には最後の2つですが、各列のレベルを個別に設定する方法が見つかりませんでしたPropertyRef:(それを行う方法はありますか?これは完全に間違った方法ですか?

4

1 に答える 1

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を使用してこれを機能させることはできませんでした

于 2013-06-06T09:51:40.857 に答える