【问题标题】:NHibernate and a denormalised tableNHibernate 和非规范化表
【发布时间】:2009-05-13 14:21:40
【问题描述】:

在具有 Employee 和 Branch 实体的网站上工作,使用数据库表“Employees”,其中还包含分支 ID 和分支名称。我无法更改客户的数据库,所以我需要从同一张表中映射员工和分支机构。

我想我需要在映射 XML 中使用不同类型的子句来从员工表中获取不同的列表或分支集?

有没有办法可以将两个类映射到同一张桌子上? (可以用 Fluent NHibernate 完成吗?)

【问题讨论】:

  • 员工与分公司的业务关系是什么?员工有分支机构吗?
  • 是的,一名员工有一个分支机构。

标签: nhibernate fluent-nhibernate nhibernate-mapping


【解决方案1】:

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&lt;Branch&gt; 可以缩短为 Component,因为编译器会自动确定类型。另外,我喜欢在我的组件的类上提供一个AsComponent 函数,这样我就不必在映射组件的任何地方重复自己:

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

这也使得在实体可能具有多个具有不同命名方案的组件实例的情况下添加前缀/后缀函数变得容易。

【讨论】:

  • 谢谢你,让它按照你的建议在 Fluent NHibernate 中工作。
【解决方案2】:

使用组件。我不知道 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; }
}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多