#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.