2009-05-06 3 views
0

Есть ли способ, чтобы NHibernate обновлял только поля, которые не имеют значения по умолчанию? Скажем, у нас есть этот простой класс:Обновление только заполненных свойств

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

Мы также имеем стандартное отображение NHibernate, используя свойства для каждого поля и Id для поля Id.

Скажем, мы хотим, чтобы страница просто обновляла имя, поэтому мы отправляем идентификатор, сохраняем его в скрытом поле и показываем текстовое поле для имени. Пользователь изменяет имя и сохраняет удары. Мы возвращаем POST, новый объект Person и назначаем входящий идентификатор и имя. Затем мы сообщим NHibernate об обновлении базы данных.

Проблема в том, что возраст, очевидно, возвращается к 0 в базе данных, так как он не был заполнен возвратом с POST. Самый очевидный способ - отправить значение Age на страницу, сохранить его в скрытом поле и заново вернуть его перед сохранением. Это отлично работает, пока вы не получите еще несколько свойств на свой объект и хотите изменить только полную их руку на экране (или большой список объектов Person, для чего может потребоваться хранить множество значений в скрытых полях).

Итак, вернемся к теме вопроса: есть ли способ сообщить NHibernate о том, что в основном игнорировать свойство Age, поскольку оно будет иметь значение по умолчанию (0), прежде чем обновляться, или я застрял в метрической тонне скрытые поля для сохранения существующих значений?

ответ

0

Это звучит немного подозрительно. Обычно, когда вы переходите к редактированию объекта Hibernate, вы сначала загружаете его из базы данных, вносите в него изменения, а затем сохраняете его обратно в базу данных. Обычно вы не должны создавать новый объект, устанавливать его идентификатор и любые произвольные свойства, а затем сохранять новый объект, потому что, как вы говорите, любые свойства, которые не заданы, скорее всего будут установлены на значения по умолчанию.

Загружая его из базы данных, все свойства заполняются соответствующим образом, поэтому вам не нужно беспокоиться о сохранении их состояния. Сессия Hibernate отвечает за поддержание состояния этих объектов, пока вы не сохраните и не сбросите их в базу данных.

Существуют различные стратегии для работы с сеансом спящего режима через веб-запросы. Ознакомьтесь с этой статьей: http://hibernatebp.blogspot.com/ - посмотрите стратегии управления сеансом. «Сессия на запрос с отдельными объектами» может быть хорошей в вашем случае.

+0

Да, я могу загрузить Личность, установить имя и сохранить его. Тем не менее, это для более крупного списка таких объектов, поэтому я либо делаю нагрузку на объект, либо получаю их все, и выполняю поиск из коллекции памяти, чтобы найти правильный объект для обновления. В любом случае это боль (хотя выполнимо). Мне было интересно, был ли более простой способ. –

1

В столбце Назад, Извлеките сохраненную сущность из репозитория с идентификатором и обновите только имя и сохраните его. Таким образом, вам не нужно поддерживать значения в скрытом поле.

+0

В этом надуманном примере в базе данных уже есть возраст, и он не может быть нулевым. Я просто не хочу, чтобы NHibernate перезаписывал существующее значение при обновлении. –

+0

Проверьте обновленный ответ –

+0

См. Другой ответ (http://stackoverflow.com/questions/831527/only-updating-filled-in-properties/831579#831579). Я знаю, что могу это сделать, но если у меня есть большая коллекция объектов для этого, я пытался избежать этого или загрузить их сразу, а затем изменить коллекцию. Похоже, что это только два варианта. –