流利的Nhibernate为递归关系

时间:2013-01-10 13:14:19

标签: c# fluent-nhibernate

我有一个代表Deparment的对象。部门可以包含许多员工和一个子部门。员工可以包含许多下属员工。如何用Fluent NHibernate表示这种关系。 Domain类看起来像这样:

public class Department : Entitybase
{
    public int Id;
    public string DepartmentName;
    public List<Employee> Employees;
    public Department SubDepartment;

}

public class  Employee : EntityBase
{
    public int Id;
    public string Name;
    public List<Employee> Subordinates
}

我的数据库表看起来像:

Department Table
   Id: int
   SubDepartmentId : int // a sub department id
   DepartmentName : string


Employee Table
    Id : int
    SuperviserId : int // A Superviser Id
    Name : string
    DepartmentId : int // a department id that contain this employee.

如何为表选择和插入数据创建流畅的nhibernate映射。

1 个答案:

答案 0 :(得分:0)

请查看Ayende关于有效选择树的帖子:

http://ayende.com/blog/4151/nhibernate-tips-tricks-efficiently-selecting-a-tree

接下来是我理解你想要的地图

  • DepartmentMap:

为了映射部门中的员工,您可以编写类似这样的内容。

Map(d => d.Id);
Map(d => d.DepartmentName);

HasMany(d => d.Employees)
.KeyColumn("DepartmentId")
.Cascade.None();

然后,对于subdepartment属性,我并不完全知道一个部门只有一个子部门。您是否希望将其作为子部门列表?

References(d => d.Subdepartment)
.Column("SubDepartmentId")
.Cascade.All();

删除此部门时,最后一个Cascade会删除子部门

  • EmployeeMap的

    地图(e =&gt; e.Id); 地图(e =&gt; e.Name); HasMany(e =&gt; e.Subordinates) .COLUMN( “SuperviserId”) .Cascade.None(); //如果这是可以为空的,请查看其他级联级别并根据需要进行修改。