流畅的NHibernate / NHibernate映射

时间:2009-09-02 15:56:11

标签: sql fluent-nhibernate nhibernate-mapping

我有一个父表和关系表来查找子父关系。 我需要找到孩子,父母及其兄弟姐妹......

EMPLOYEE_RELATION具有保存关系的EMPLOYEE_ID和PARENT_ID列。

这就是SQL的样子。如何将其映射到Fluent NHibernate / NHibernate。

select 
   V1.PARENT_ID AS PARENT_ID, 
   V.EMPLOYEE_ID AS EMPLOYEE_ID,
   V2.EMPLOYEE_ID AS SIBLINGS_ID 
 FROM
    EMPLOYEE V
 INNER JOIN EMPLOYEE_RELATION  V1
   ON  V.EMPLOYEE_ID = V1.EMPLOYEE_ID
 INNER JOIN EMPLOYEE_RELATION V2
   ON V2.PARENT_ID = V1.PARENT_ID
 WHERE V.EMPLOYEE_ID = 6357

2 个答案:

答案 0 :(得分:2)

您应该能够使用跨表EMPLOYEE_RELATION使用多对多方法创建图表。换句话说,在你获取了一些实体之后,你应该能够获取附加到它上面的所有子节点作为父节点相同对象的简单列表。你应该能够进一步遍历它,但我不完全确定。

以下是映射文件中的外观:

        HasManyToMany(x => x.Employees)
            .WithTableName("EMPLOYEE_RELATION")
            .WithParentKeyColumn("PARENT_ID")
            .WithChildKeyColumn("EMPLOYEE_ID")
            .Cascade.AllDeleteOrphan()
            .LazyLoad();

答案 1 :(得分:0)

免责声明:我是一名java Hibernate用户;我没有使用NHibernate,但我认为它非常相似。

一些伪代码:假设你有两个实体对象,比如:

public class EmployeeRelation {
 Employee Parent //parent property
 Employee Employee //child property
}

public class Employee {
 int EmployeeID
 ...
}

您需要使用多对一关系映射EmployeeRelation上的每个属性(许多EmployeeRelations可以指向同一个Employee)。 hibernate文档详细说明了这种关系的配置信息。

然后你可以这样做(这是Java风格的代码所以NH可能会有所不同):

Criteria c = session.createCriteria(Employee.class);
c.add(Restrictions.eq("EmployeeID", 6357));
Employee myEmployee = (Employee)c.uniqueResult();

然后,为了得到兄弟姐妹(这个父母的所有关系):

c = session.CreateCriteria(EmployeeRelation.class);
c.add(Restrictions.eq("Parent", myEmployee));
List<EmployeeRelation> siblings = (List<EmployeeRelation>)c.uniqueResult();

这不是我的头脑;您可以使用HQL在一个查询中找到更优雅的方式来完成所有操作。如果每个Employee只能拥有一个父项,那么您还可以查看将Employee映射到其他Employee对象和父Employee引用的集合,而不是使用EmployeeRelation对象。

HTH!