Свободное Nhibernate и динамическое имя таблицы - PullRequest
1 голос
/ 17 февраля 2010

У меня есть родительский и дочерний объект. В зависимости от значения в родительском объекте изменяется таблица для дочернего объекта. Так, например, если родительский объект имел ссылку «01», он будет выглядеть в следующей таблице «Child01», тогда как, если ссылка была «02», он будет выглядеть в таблице «Child02». Все дочерние таблицы такие же, как в количестве столбцов / имен / и т. Д.

Мой вопрос заключается в том, как я могу сказать Fluent Nhibernate или nhibernate, какую таблицу смотреть, поскольку каждый родительский объект уникален и может ссылаться на несколько разных дочерних таблиц?

Я смотрел на IClassConvention в Fluent, но, похоже, он вызывается только при создании сеанса, а не при каждом создании объекта.

Ответы [ 2 ]

1 голос
/ 21 февраля 2010

Я нашел только два способа сделать это.

  1. Закройте и воссоздайте сеанс nhibernate каждый раз, когда нужно просмотреть другую динамическую таблицу. При создании сеанса используйте IClassConvention для динамического вычисления имени на основе пользовательских данных. Я нашел это очень интенсивным, так как это большая база данных и дорогостоящая операция по созданию сеанса каждый раз.
  2. Использовать объект POCO для этих таблиц с пользовательским доступом к данным.

Как сказал statichippo, я мог бы использовать объект basechild и иметь несколько дочерних объектов. Из-за размера базы данных и количества динамических таблиц этот параметр не был действительным.

Ни одно из моих двух решений не было мне особенно приятно, но POCO казалось лучшим способом решения моей проблемы.

0 голосов
/ 17 февраля 2010

NHibernate предназначен для объекта реляционных картографов. Похоже, вы делаете больше в стиле сценариев и надеетесь отобразить свои данные вместо того, чтобы работать в режиме ООП.

Звучит так, будто у вас есть замыслы иерархии классов. То, что звучит , как будто вы пытаетесь создать в своем коде (и затем соответственно отобразить), представляет собой иерархию разных типов детей:

BaseChild

-> SmartChild

-> DumbChild

Каждый дочерний элемент является либо умным, либо немым, но, поскольку у них всех есть FirstName, LastName, Age и т. Д., Они все являются экземплярами класса BaseChild, который определяет их. Единственные различия могут заключаться в том, что у SmartChild есть IQ, а у DumbChild - FavoriteFootballTeam (это всего лишь пример, конечно, никому не обидно;).

NHibernate позволит вам отображать такие отношения во многих отношениях. Может быть одна таблица, которая охватывает все классы или (как это звучит, как вы хотите в вашем случае), по одной таблице на класс.

Я понял проблему / что вы ищете?

...