2011-09-26 36 views
4

我无法让Fluent Nhibernate Automapper创建我想要的东西。我有两个实体,它们之间有一对多的关系。流畅的NHibernate与干预连接表的一对多?

class Person 
    { 
     public string name; 
     IList<departments> worksIn; 

    } 

    class Department 
    { 
     public string name; 
    } 

以上显然是裸露的骨头,但我会期待产生的充实架构:不幸的是

Person{id, name} 
Department{id, name} 
PersonDepartment{id(FK person), id(Fk Department)} 

,我不是得到:

Person{id, name} 
Department{id, name, personid(FK)} 

我不不想要包含在部门表中的Person的FK,我想要一个单独的联合/查找表(上面的PersonDepartment),它包含两个表的主键作为组合PK和FKS。

我不确定如果我正在绘制我的初始类错误(也许应该只是在工作中 - 代表ids,而不是List worksIn),或者如果我需要手动映射它?

可以这样做吗?

+0

请问这个问题涉及到功能NHibernate? –

+0

对不起,是的。我会重新编辑。 – user676767

回答

0

类的结构方式表明了一对多的关系(事实上,这就是你如何在你的问题中描述它),所以FNH选择以这种方式建模数据库关系应该不会感到意外。

正如您所建议的那样,您可以手动创建多对多表格映射。但是,这绝对是你想要的吗?

我倾向于发现纯多对多的关系是非常罕见的,并且通常引入中间实体并使用两个一对多关系通常是很好的情况。这使得可以向该链接添加额外的信息(例如,一个人的“主要”部门,或者他们各自部门内的办公室的详细信息)。

一些示例“裸机”类说明这种结构:

public class Person 
{ 
    public int Id { get; set;} 

    public string Name { get; set;} 

    public IList<PersonDepartment> Departments { get; set; } 
} 

public class PersonDepartment 
{ 
    public int Id { get; set; } 

    public Person Person { get; set; } 

    public Department Department { get; set; } 

    public bool IsPrimary { get; set; } 

    public string Office { get; set; } 
} 

public class Department 
{ 
    public int Id { get; set; } 

    public IList<PersonDepartment> Personnel { get; set; } 

    public string Name { get; set; } 
} 
+0

这绝对是正确的路线。出于某种原因,我并不认为我需要映射中间实体本身。现在这种关系只需要从Person到Department,所以不需要Personnel。问题是我从非休眠方式来到它,更习惯于在返回对象之前遍历sql中的中间方法。非常感谢你的帮助! – user676767