为一个1:n关系生成两个关系列

时间:2012-10-06 20:56:31

标签: c# sql-server nhibernate fluent-nhibernate

我正在尝试使用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的调用应该压制第二列 - 但是,它没有。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

我不知道确切的Fluent语法,但基本上你需要告诉它HasMany的关键列是Owner_id

答案 1 :(得分: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();
    }
}