NHibernate和非规范化表

时间:2009-05-13 14:21:40

标签: nhibernate fluent-nhibernate nhibernate-mapping

使用包含分支ID和分支名称的数据库表“Employees”在具有Employee和Branch实体的网站上工作。我无法更改客户端的数据库,因此我需要从同一个表中映射Employees和Branches。

我想我需要在映射XML中使用某种类型的distinct子句来从employee表中获取一个不同的列表或一组分支?

有没有办法可以在同一个表上映射这两个类? (可以用Fluent NHibernate完成吗?)

2 个答案:

答案 0 :(得分:2)

Stefan是正确的,使用组件。在FluentNHibernate中,它看起来像:

class Branch
{
    string Name { get; set; }
    DateTime DateOpened { get; set; }
}

class Employee
{
    int Id { get; set; }
    string Name { get; set; }
    Branch Branch { get; set; }
}

class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Component<Branch>(x => x.Branch, c => {
            c.Map(x => x.Name);
            c.Map(x => x.DateOpened);
        });
    }
}

Component<Branch>可以缩短为Component,因为编译器会自动计算出类型。另外,我喜欢做的是在我的组件的类上提供AsComponent函数,所以我不必在映射组件的每个地方重复自己:

public static class BranchMap
{
    public Action<ComponentPart<Branch>> AsComponent()
    {
        return c =>
        {
            c.Map(x => x.Name);
            c.Map(x => x.DateOpened);
        };
    }
}

对于实体可能具有多个具有不同命名方案的组件实例的情况,这也可以很容易地添加前缀/后缀函数。

答案 1 :(得分:1)

使用组件。我不知道FluentNhibernate,但在xml中,它看起来像这样:

<class name="Employee">
  ...

  <component name="MyBranch">
    <!-- Branche properties are here: -->
    <property name="BrancheName"/>
    <property name="..."/>
  </component>
</class>

class Employee
{
  Branch MyBranch { get; private set; }
}

class Branch
{
  string BrancheName { get; private set; }
}

实际上非常简单。出于性能原因,您也是这样做的,因为当员工总是有分支时,您不需要连接表。

注意:如果所有列都为null,则myBranch将为null。