0

我正在尝试使用 Fluent NHibernate 建模一个简单的 1:n 关系:
有人和项目。一个人拥有零到无限的物品,而一件物品属于一个人。

我的数据类:

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();
    }
}

当我尝试使用 NHibernate 的SchemaExport类创建数据库模式时,出现了我的问题。

Item 表实际上有两列引用 Person 表:

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

这是为什么?
一列应该就足够了——据我所知,调用Inverse应该抑制第二列——但是,事实并非如此。

我究竟做错了什么?

4

2 回答 2

2

您的假设是错误的 - 调用Inverse告诉 NH 关系是从另一端管理的(即您将通过设置添加项目Owner);它不会改变有关模式生成的任何内容。

我不知道确切的 Fluent 语法,但基本上你需要告诉它 is 的键HasManyOwner_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 回答