Свободный NHibernate - объединить несколько строк в один объект - PullRequest
5 голосов
/ 08 апреля 2011

У меня есть таблица базы данных, которую я не могу изменить, которая содержит такие данные, как:

FooTable
Id     | EntityAUniqueId | EntityBUniqueId | EntityCUniqueId
============================================================
1      | A1              | B1              | C1
2      | A1              | B1              | C2
3      | A1              | B2              | C3
4      | A1              | B2              | C4
5      | A2              | B3              | C5
6      | A2              | B3              | C6
7      | A2              | B4              | C7
8      | A2              | B4              | C8

Я хочу сопоставить это со следующей структурой:

interface IEntityA
{
    string UniqueId { get; }
    IEnumerable<IEntityB> { get; }
}

interface IEntityB
{
    string UniqueId { get; }
    IEnumerable<IEntityC> { get; }
}

interface IEntityC
{
    string UniqueId { get; }
}

class EntityA : IEntityA { ... }
class EntityB : IEntityB { ... }
class EntityC : IEntityC { ... }

Приведенные выше данные приведут к удалению следующих объектов:

EnityA(A1)
  |-EnityB(B1)
  |   |-EntityC(C1)
  |   |-EntityC(C2)
  |-EnityB(B2)
      |-EntityC(C3)
      |-EntityC(C4)
EnityA(A2)
  |-EnityB(B3)
  |   |-EntityC(C5)
  |   |-EntityC(C6)
  |-EnityB(B4)
      |-EntityC(C7)
      |-EntityC(C8)

В настоящее время мне нужно только написать в таблицу, а не читать.

Я использую FluentNHibernate с AutoMapping и соглашениями.

Я начал идти по дороге Компонентов, но понял, что это не то, для чего они были предназначены. Одним из возможных решений было бы использование трех представлений на столе, но это добавляет дополнительные проблемы, и я хотел бы избежать этого, если это возможно, и я не могу не чувствовать, что в рамках уже должно быть что-то для решения этой проблемы.

Если интерфейсы запутывают ответ, не стесняйтесь опускать их из решения.

1 Ответ

1 голос
/ 28 апреля 2012

Итак, у вас есть денормализованные данные в вашей таблице. Я не знаю, как справиться с тем типом картирования, который вы запрашиваете. Я могу придумать 2 обходных решения.

1) Создайте представления в базе данных, чтобы нормализовать ваши данные, и создайте сопоставления с этими представлениями. Просмотры как

ViewEntityA
-----------
IdColumn: EntityAUniqueId
AnyDataColumns

ViewEntityB
-----------
IdColumn: EntityBUniqueId
FkColumn: EntityAUniqueId
AnyDataColumns

ViewEntityC
-----------
IdColumn: EntityCUniqueId
FkColumn: EntityBUniqueId
AnyDataColumns

Затем можно записать логику триггера вставки / обновления / удаления ( Reference1 , Reference 2 ) для обработки обновлений NHibernate.

2) Отобразить таблицу как есть. Вручную сопоставьте иерархию объектов .net в C #. Обновите все таблицы базы данных, не используя отношения сущностей NHibernate.

...