2009-05-01 17 views
13

Я выполняю стандартное обновление в NHibernate до одного свойства. Однако при фиксации транзакции обновление sql, по-видимому, устанавливает все поля, которые я отобразил на таблице, хотя они не изменились. Неужели это не может быть нормальным поведением в Нюбернате? Я делаю что-то неправильно? ThanksОбновление NHibernate для одного свойства обновляет все свойства в sql

using (var session = sessionFactory.OpenSession()) 
      { 
       using (var transaction = session.BeginTransaction()) 
       { 
        var singleMeeting = session.Load<Meeting>(10193); 
        singleMeeting.Subject = "This is a test 2"; 

        transaction.Commit(); 
       } 
      } 
+0

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

+0

@ YonatanKarni, это не только о производительности, но и о согласованности. См. Этот вопрос [/ q/13954882/1178314) и его [принятый в настоящее время ответ] (/ a/13955305/1178314). –

ответ

16

Это нормальное поведение. Вы можете попробовать добавить dynamic-update="true" в определение класса, чтобы переопределить это поведение.

3

Хорошо. да, это нормальное поведение для NHibernate. Вы можете использовать сгенерированный атрибут для своих свойств, чтобы изменить поведение. Подробности на Ayende's blog.

Почему это по умолчанию, потому что с динамикой вы не получаете свой план запроса в кеше. И, как правило, вы не возражаете, что вы отправляете несколько байт по высокоскоростному сетевому соединению между вашим сервером приложений и базой данных. Если вы не сохраняете длинные строки, где эта настройка идеально подходит.

+0

Хотя Generated означает, что поле не будет отправлено через обновление, это также означает, что поле обрабатывается на стороне сервера. Вместо этого NabilS ищет те поля, которые будут отправлены, которые были изменены. –

+0

На самом деле это сообщение в блоге не дает требуемой информации, так как оно относится к уровню собственности. @ Дарин отвечает на уровне класса, и именно там вы можете изменить это поведение. – Jonno

 Смежные вопросы

  • Нет связанных вопросов^_^