2014-02-14 4 views
2

Я пытаюсь обновить один столбец в таблице. UPDATE не выдано (проверено с использованием SQL Profiler). Нет ошибок.NHibernate не сохраняет только одно свойство

  • Составление карт имеет dynamic-update="true".
  • В классе не включено управление версиями.
  • Флеш-режим Commit.
  • Недвижимое имущество, преобразованное без модификаторов вставки/модификации (<property name="Deleted" />).
  • Недвижимость автоматически реализована (public virtual bool Deleted { get;set;}).
  • NH 3.3.0, .NET 4, x64.

    using (var transaction = this._session.BeginTransaction()) 
    { 
        try 
        { 
         var order = this.session.Load<Order>(id); 
         order.Deleted = true; 
         this._session.Update(order); 
         transaction.Commit(); 
        } 
        catch (Exception) 
        { 
         transaction.Rollback(); 
         throw; 
        } 
    } 
    
+1

Если вы нарушаете строку фиксации транзакции, это _session.IsDirty() true? Удаляется ли авто-свойство или имеет поле поддержки? И вам не нужно вызывать Update на сессии, но я сомневаюсь, что это проблема. –

+0

Используете ли вы управление версиями? – Rippo

+0

Мы не можем угадать, что находится внутри 'Repository.Load'. Пожалуйста, замените эту строку на 'var order = _session.Get (id)'. При этом '_session.Update' не требуется. Вам также не нужно вручную откатывать транзакцию. –

ответ

4

На основе комментариев, что вы пытаетесь сделать, это создать прокси-сервер без получения текущего состояния из БД (с использованием session.Load), а затем выдает динамическое обновление.

Это не сработает. NHibernate не записывает отдельные изменения свойств; вместо этого это:

  • Сравнивает текущее состояние отслеживаемых объектов с моментальным снимком значений свойств, полученных из базы данных.
  • Исходя из этого, определяет, какие объекты загрязнены (т. Е. Имеют изменения)
  • Он генерирует инструкцию обновления SQL. Если используется dynamic-update, он будет содержать только измененные свойства.

Если вы используете session.Load, как только вы получаете доступ к Deleted собственности, NH загрузит запись из базы данных. Используете ли вы session.Load или session.Get, session.Update на уже отслеживаемом объекте нет-op.

С другой стороны, если у вас уже есть состояние для всех свойств заказа, вы можете обновить без нагрузки:

var order = GetTheOrderFromMemory(); 
order.Deleted = true; 
session.Update(order); 
transaction.Commit(); 

Это будет не уважения dynamic-update, а NH не есть снимок для сравнения с ...

... вот почему HQL - единственный способ сделать однократное обновление отдельного свойства.

+0

К сожалению, это действительно так. Я буду придерживаться Load and Update (который по какой-то причине начал работать, получая и обновляя, чего раньше не делал). Спасибо за помощь. –

+0

Приятно слышать. Но, как сказано выше, 'Update' не требуется, если вы уже загружаете. –

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