我正在尝试使用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
的调用应该压制第二列 - 但是,它没有。
我做错了什么?
答案 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();
}
}