NHibernate и денормализованный стол - PullRequest
2 голосов
/ 13 мая 2009

Работа на веб-сайте, который имеет сущности Employee и Branch, используя таблицу базы данных «Employees», которая также содержит идентификатор ветви и имя ветви. Я не могу изменить базу данных клиента, поэтому мне нужно сопоставить сотрудников и филиалы из одной таблицы.

Полагаю, мне нужен какой-то отдельный тип в XML-коде для получения отдельного списка или набора ветвей из таблицы employee?

Есть ли способ сопоставить оба класса на одной таблице? (Можно ли это сделать с помощью Fluent NHibernate?)

Ответы [ 2 ]

2 голосов
/ 13 мая 2009

Стефан правильный, используйте компоненты. В 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 голос
/ 13 мая 2009

Используйте компоненты. Я не знаю 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.

...