2012-10-06 78 views
0

我想用流利NHibernate建模一个简单的1:n关系:
有人员和项目。一个人拥有零到无限的物品,而一个物品属于一个人。为一个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; } 
} 

和映射:当我尝试创建一个使用NHibernate的SchemaExport类数据库架构

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

我的问题就出现了。

项目表实得两列引用Person表:

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

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

我在做什么错?

回答

2

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

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

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

谢谢 - 有没有这“神奇字符串”适用于任何替代不变? – Matthias

+0

@ winSharp93“魔术串”并不是你所想象的。但如果你想要使用'const' –

+0

使用“Magic String”我的意思是代码中的字符串常量,因为它引用了代码的另一部分,所以很容易被忘记更改(在这种情况下,String的值取决于Name “所有者”财产)。因此,引入一个常数不会改变太多恕我直言。根据你的定义什么是“魔术串”?或者你认为我认为这是一个魔术字符串是什么? ;-) 那么通常认为最好的做法是一般指定映射文件中的所有列名称呢? – Matthias