Я работаю над проектом NHibernate, и у меня есть вопрос об обновлении временных сущностей.
В основном рабочий процесс выглядит следующим образом:
- Создайте DTO (проекцию) и отправьте клиенту по сети. Это имеет небольшое подмножество свойств сущности.
- Клиент отправляет обратно измененный DTO
- Сопоставьте свойства DTO обратно с соответствующей сущностью, чтобы оператор UPDATE мог быть сгенерирован и выполнен NH.
- Сохраните объект
Пункт 4, где у меня есть проблема. В настоящее время я могу добиться этого обновления с помощью метода session.Merge(), однако перед обновлением он должен сначала загрузить объект из базы данных (предполагается, что нет 2LC). Таким образом, запускаются как оператор выбора, так и оператор обновления.
Что я хотел бы сделать, так это создать временный экземпляр объекта, сопоставить новые значения из DTO, а затем заставить NH сгенерировать оператор SQL, используя только те свойства, которые я изменил. В дополнительном выборе не должно быть необходимости, поскольку у меня уже есть идентификатор объекта и значения, необходимые для предложения SET. Возможно ли это в НГ?
В настоящее время при использовании session.Update() все свойства будут включены в оператор обновления, и возникнет исключение из-за неинициализированных свойств, которые не являются частью DTO.
По сути, мне нужен способ указать, какие свойства объекта являются грязными, чтобы только они были включены в обновление.
== ИЗМЕНИТЬ ==
Например...
public class Person
{
public virtual int PersonId { get; set; }
public virtual string Firstname { get; set; }
public virtual string Nickname { get; set; }
public virtual string Surname { get; set; }
public virtual DateTime BirthDate { get; set; }
}
И тестовый пример.
// Create the transient entity
Person p = new Person()
p.id = 1;
using (ISession session = factory.OpenSession())
{
session.Update(p);
// Update the entity – now attached to session
p.Firstname = “Bob”;
session.Flush();
}
Я надеялся сгенерировать оператор SQL, похожий на «ОБНОВЛЕНИЕ Persons SET Firstname = «Bob» WHERE PersonID = 1». Вместо этого я получаю исключение DateTime вне диапазона из-за того, что BirthDate не инициализирован. Для него не требуется BirthDate, поскольку он не требуется для оператора SQL. Может это не возможно?
== /РЕДАКТИРОВАТЬ ==
Заранее спасибо, Джон