Сессия NHibernate. Сброс () отправляющий запросы на обновление, когда никакое обновление не произошло

Почему люди делают это так сложно.

Этого должно быть достаточно.

Не реализуйте onPostExecute в задаче async, скорее реализуйте его в Activity:

public class MainActivity extends Activity 
{

@Override
public void onCreate(Bundle savedInstanceState) {

    //execute the async task 
    MyAsyncTask task = new MyAsyncTask(){
            protected void onPostExecute(String result) {
                //Do your thing
            }       

    }

    task.execute("Param");

}


}
34
задан NullUserException 14 February 2013 в 06:25
поделиться

3 ответа

Я видел это однажды, когда одна из моих моделей не была отображена правильно (не использовал nullable типы правильно). Можно ли вставить модель и отображение?

16
ответ дан Ryan Duffield 27 November 2019 в 16:46
поделиться

Я также столкнулся с этой проблемой в NH 2.0.1, когда пытался скрыть обратные концы пакетов «многие ко многим» с помощью access = "noop" (подсказка: это не работает).

Преобразование их в access = "field" + добавление поля в класс устранило проблему. Однако отследить их довольно сложно.

0
ответ дан 27 November 2019 в 16:46
поделиться

Всегда будьте осторожны с полями NULLable, когда имеете дело с NHibernate. Если ваше поле в БД имеет значение NULLable, убедитесь, что соответствующий класс .NET также использует тип Nullable. В противном случае произойдут самые разные странности. Обычно симптом заключается в том, что NHibernate будет пытаться обновить запись в БД, даже если вы не изменили никаких полей с тех пор, как прочитали объект из базы данных.

Следующая последовательность объясняет, почему это происходит:

  1. NHibernate извлекает необработанные данные объекта из БД с использованием ADO.NET
  2. NHibernate конструирует объект и устанавливает его свойства
  3. Если поле БД содержит NULL, свойство будет установлено в значение по умолчанию для его типа:
    • свойства ссылочных типов будут установлены на null
    • свойства целочисленных типов и типов с плавающей запятой будут установлены на 0
    • свойства типа boolean будут установлены на false
    • свойства типа DateTime будут установлены на DateTime.MinValue
    • и т. Д.
  4. Теперь, когда транзакция фиксируется, NHibernate сравнивает значение свойства с исходным значением поля, которое он считал из базы данных, и поскольку поле содержит NULL, но свойство содержит ненулевое значение , NHibernate считает свойство грязным и принудительно обновляет enity.

Это не только снижает производительность (вы получаете дополнительный возврат к базе данных и дополнительное обновление каждый раз, когда вы извлекаете объект), но также может вызвать трудно устранить ошибки со столбцами DateTime. Действительно, когда свойство DateTime инициализируется значением по умолчанию, оно устанавливается на 1/1/0001. Когда это значение сохраняется в БД, SqlClient ADO.NET не может преобразовать его в допустимое значение SqlDateTime, так как минимально возможное значение SqlDateTime равно 1/1/1753 !!!

Самое простое исправление - заставить свойство класса использовать Nullable введите, в данном случае «DateTime?». В качестве альтернативы вы можете реализовать настраиваемый сопоставитель типов, реализуя IUserType с его методом Equals, правильно сравнивая DbNull.Value с любым значением по умолчанию вашего типа значения. В нашем случае Equals потребуется вернуть true при сравнении 1/1/0001 с DbNull.Value. Реализовать полнофункциональный IUserType на самом деле не так сложно, но для этого требуется знание мелочей NHibernate, поэтому приготовьтесь к существенному поиску в Google, если вы решите пойти по этому пути.

t преобразовать его в допустимое значение SqlDateTime, так как минимально возможное значение SqlDateTime равно 1/1/1753 !!!

Самое простое исправление - заставить свойство класса использовать тип Nullable, в данном случае «DateTime?». В качестве альтернативы вы можете реализовать настраиваемый сопоставитель типов, реализуя IUserType с его методом Equals, правильно сравнивая DbNull.Value с любым значением по умолчанию вашего типа значения. В нашем случае Equals необходимо вернуть true при сравнении 1/1/0001 с DbNull.Value. Реализовать полнофункциональный IUserType на самом деле не так сложно, но для этого требуется знание мелочей NHibernate, поэтому приготовьтесь к существенному поиску в Google, если вы решите пойти по этому пути.

t преобразовать его в допустимое значение SqlDateTime, так как минимально возможное значение SqlDateTime равно 1/1/1753 !!!

Самое простое исправление - заставить свойство класса использовать тип Nullable, в данном случае «DateTime?». В качестве альтернативы вы можете реализовать настраиваемый сопоставитель типов, реализовав IUserType с его методом Equals, правильно сравнивая DbNull.Value с любым значением по умолчанию для вашего типа значения. В нашем случае Equals необходимо вернуть true при сравнении 1/1/0001 с DbNull.Value. Реализовать полнофункциональный IUserType на самом деле не так сложно, но для этого требуется знание мелочей NHibernate, поэтому приготовьтесь к существенному поиску в Google, если вы решите пойти по этому пути.

вы можете реализовать настраиваемый сопоставитель типов, реализуя IUserType с его методом Equals, правильно сравнивая DbNull.Value с любым значением по умолчанию вашего типа значения. В нашем случае Equals необходимо вернуть true при сравнении 1/1/0001 с DbNull.Value. Реализовать полнофункциональный IUserType на самом деле не так сложно, но для этого требуется знание мелочей NHibernate, поэтому приготовьтесь к существенному поиску в Google, если вы решите пойти по этому пути.

вы можете реализовать настраиваемый сопоставитель типов, реализуя IUserType с его методом Equals, правильно сравнивая DbNull.Value с любым значением по умолчанию вашего типа значения. В нашем случае Equals необходимо вернуть true при сравнении 1/1/0001 с DbNull.Value. Реализовать полнофункциональный IUserType на самом деле не так сложно, но для этого требуется знание мелочей NHibernate, поэтому приготовьтесь к существенному поиску в Google, если вы решите пойти по этому пути.

45
ответ дан 27 November 2019 в 16:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: