Почему NHibernate передает значения по умолчанию для вставки, если Save вызывается до заполнения объекта? - PullRequest
0 голосов
/ 16 ноября 2009

Если я вызову Сохранить для нового объекта, а затем заполню его свойства, NHibernate создаст и вставит оператор, который содержит только значения по умолчанию для свойств. Например (сессия является открытой ISession):

var homer = new Person();
session.Save(homer);
homer.Name = "Homer J. Simpson";
session.Flush();

Я думал, что вызов Save сделает гомера постоянным, а NH отследит любые изменения и включит их во вставку. Вместо этого он выдает вставку с параметром свойства name, установленным в null. Если я ставлю вызов Сохранить после назначения, то это работает. Этот объект имеет идентификатор GUID, назначенный NH, поэтому он не выполняет преждевременную вставку для получения идентификатора.

ETA Я использую сеанс на запрос в приложении ASP.NET и шаблон, которому я хочу следовать:

MyObject myObject;
if (id == null)
{
    myObject = new MyObject();
    repository.Add(myObject);
}
else
{
    myObject = repository.GetMyObject(id);
}
// populate myObject's properties
// NH magic happens here when the HTTP request ends

Ответы [ 3 ]

2 голосов
/ 16 ноября 2009

Я думаю, что ваше предположение в этом случае просто неверно.

Читая предоставленный вами пример кода, вы также можете ожидать, что NHibernate вставит объект, а затем впоследствии изменит имя и затем выдаст обновление. Это, однако, предполагает, что Flush неявно сохраняет измененное состояние.

1 голос
/ 16 ноября 2009

Мне также интересно, почему это происходит. NH действительно должен подождать, чтобы вставить объект в базу данных.

Причины, почему можно сделать это:

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

Это действительно код, который вы запускаете для воспроизведения теста?

Как выглядит файл сопоставления?

0 голосов
/ 16 ноября 2009

Вы только что упомянули об этом в ответе на мой (возможно, довольно наивный) комментарий. Вы установили сеанс FlushMode на Auto. Измените это на Manual, и вы с большей вероятностью увидите поведение, которое вы ищете.

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

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