Словарь сопоставления NHibernate для нескольких таблиц - PullRequest
0 голосов
/ 28 августа 2011

Недавно я столкнулся с проблемой использования словарей отображения nhibernate для конкретной модели отношений.Сторона OO включает следующие сущности:

class B // base class
{
    public long Id;
    public string Name;
    public Owner; // a reference to the owner group
}

class Group : B
{
    public IDictionary<string, B> ObjectsInGroup; 
        // dictionary for a look-up from name of any object contained in the group 
        // to the object itself
}

, и я хотел использовать следующие таблицы для сохранения вышеуказанных сущностей

определение столбца таблицы B для хранения сущностей типа B:

  • Id: bigint (первичный ключ)
  • Имя: nvarchar (50)
  • Владелец: bigint (относится к Id в качестве внешнего ключа)

определение столбца таблицы G для хранения сущностей типа Группа:

  • Id: bigint (первичный ключ)

Поскольку объекты в группе управляются в словаре,и словарное отображение nhibernate предназначено для использования, я предполагаю, что фактическая таблица, на которой основано отображение, извлечена из таблицы B. поскольку стандартная таблица, лежащая в основе отображения словаря, имеет следующую форму:

Id (из словаря провайдера) |Ключ |Значение

, где каждая строка представляет пару ключ-значение в словаре сущности с идентификатором 'Id'.

Таким образом, в основном, воображаемая таблица в такой форме для включения отображения можетбыть создан с помощью следующего SQL (просто чтобы дать некоторое представление или прояснить вопрос):

выберите g.Id, o.Name, o.Id из G g, B o, где o.Owner = g.Id

Это несколько упрощенная модель, в оригинале может быть отдельный класс для конечных объектов, в который может быть включена дополнительная таблица, что еще больше усугубит проблему.

Не уверенподдерживает ли NHibernate такое отображение, или если есть какие-то обходные пути или необходимость перепроектировать модель.Любые мысли приветствуются.

1 Ответ

0 голосов
/ 28 августа 2011

Я думаю, что проблема здесь не в отображении, а в модели.
Логично, я думаю, что иметь коллекцию B в вашем Group классе было бы лучше.
(IEnumerable<B> ObjectsInGroup)
Поиск по имени объекта можно легко выполнить с помощью LINQ ObjectsInGroup.Where(b => b.Name == "blah");.
Таким образом, ваше отображение будет намного проще, а ваш класс более понятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...