Fluent NHibernate — сведение нескольких строк в единый объект

#nhibernate #fluent-nhibernate #entity-relationship #automapping

#nhibernate #fluent-nhibernate #объект-взаимосвязь #автоматическое сопоставление

Вопрос:

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

 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 с автоматическим отображением и соглашениями.

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

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

Комментарии:

1. не уверен, чего вы хотите здесь достичь; можете ли вы объяснить, почему у вас есть коллекции EntityA / B / C? согласно вашему примеру, кажется, что к каждому UniqueID подключена ровно одна строка данных. или есть другие таблицы, которые здесь не упомянуты?

Ответ №1:

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

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

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

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

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

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

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

Комментарии:

1. Прошло много времени с тех пор, как я опубликовал это, и я больше не работаю в компании. Я думаю, что мы использовали что-то похожее на вариант 2, но представление было бы подходящим решением, хотя я действительно выступал за собственное отображение Fluent NHibernate.