0

Fluent NHibernate を使用して単純な 1:n の関係をモデル化しようとしています:
人とアイテムがあります。1 人のアイテムが 1 人に属しているのに対し、1 人はゼロから無限のアイテムを持っています。

私のデータクラス:

public class Person
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Item> Items { get; set; }
}
public class Item
{
    public virtual int Id { get; set; }
    public virtual Person Owner { get; set; }
}

およびマッピング:

public sealed class ItemMap : ClassMap<Item>
{
    public ItemMap()
    {
        Id(x => x.Id);
        References(x => x.Owner);
    }
}
public sealed class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        HasMany(x => x.Items).Inverse();
    }
}

SchemaExportNHibernate のクラスを使用してデータベース スキーマを作成しようとすると、問題が発生します。

Item テーブルは、実際には Person テーブルを参照する 2 つの列を取得します。

create table [Item] (
    Id INT IDENTITY NOT NULL,
   Owner_id INT null,
   Person_id INT null,
   primary key (Id)
)

何故ですか?
1 つの列で十分なはずです - 私が理解している限り、呼び出しInverseは 2 番目の列を抑制する必要があります - しかし、そうではありません。

私は何を間違っていますか?

4

2 に答える 2

2

あなたの仮定は間違っています - への呼び出しInverseは、関係が反対側から管理されていることを NH に伝えます (つまり、 を設定して項目を追加しますOwner)。スキーマの生成については何も変わりません。

正確な Fluent 構文はわかりませんが、基本的には、 のキー列が であることを伝える必要がありHasManyますOwner_id

于 2012-10-07T12:58:25.173 に答える
1

のマッピングは次のPersonようになります。

public sealed class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        HasMany(x => x.Items)
            .KeyColumn("Owner_id")
            .Inverse();
    }
}
于 2012-10-07T13:08:15.140 に答える