Управление сгенерированной настройкой свойства в NHibernate - PullRequest
0 голосов
/ 24 июня 2010

У меня есть случай, когда один из столбцов в базе данных генерируется с использованием триггера из-за особого способа, которым мы генерируем это значение, которое я не могу изменить.Если я в своем отображении в NHibernate задает для свойства Generated = Insert, это работает как шарм, где NHibernate вставляет строку без сгенерированного свойства, а затем делает выбор, чтобы извлечь значение из базы данных.

Но у меня также есть случаи, когда я хочу иметь возможность установить свойство явно (триггер создан для установки столбца, только если он не установлен).Но я не могу получить NHibernate, чтобы позволить мне сделать это.Когда он установлен на generate = insert, он всегда будет игнорировать свойство, которое я установил в моем объекте.Поэтому я действительно хочу иметь возможность каким-то образом сообщить NHibernate, что когда свойство «нетронуто» / null, действует как свойство, но если оно установлено, не нужно.

Возможно ли настроить NHibernate таким образомкак-то?

Ответы [ 3 ]

1 голос
/ 26 июня 2010

Я не думаю, что вы можете достичь этого с помощью конфигурации. Однако вы можете просто вызвать ISession.Refresh(myObject) после вставки, чтобы заставить ее вернуться в базу данных и обновить объект.

0 голосов
/ 26 июня 2010

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

Но из того, что я могу понять, NHibernate не обладает такой гибкостью и в некоторой степени противоречит своей структуре конфигурации, где он создает фабрику сеансов один раз для многократного использования.

Альтернативным решением может быть создание двух фабрик сессий, по одному для каждого из моих сценариев. Первый (где генерируется свойство) - это нормальное использование. Второй (где свойство не генерируется) - это сценарии загрузки, когда мне нужно сохранить значение свойства в коде. Я использую FluentNHibernate для отображений, и, поскольку он отражается в моих классах отображений, я мог установить состояние во время создания фабрик сессий, поэтому, когда мое отображение читается, я мог бы сделать оператор if / else, основанный на фабрике сессий в настоящее время строится. Это должно позволить мне достичь обоих без дублирующих конфигураций, хотя с двумя фабриками сессий в игре вместо одной.

Я еще не пробовал, только теория, но это должно решить мою проблему, и, надеюсь, другие пытаются достичь подобного.

0 голосов
/ 24 июня 2010

Документация для состояний свойств generated (выделено мое):

Свойства, помеченные как сгенерированные, должны дополнительно не вставляться и не обновляться .Только Раздел 5.1.7, «версия (необязательно)», Раздел 5.1.8, «отметка времени (необязательно)» и Раздел 5.1.9, «Свойство» могут быть помечены как сгенерированные.

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

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