Я работаю над проектом NHibernate и у меня есть вопрос относительно обновления временных объектов.
В основном рабочий процесс выглядит следующим образом:
- Создайте DTO (проекцию) и отправьте клиенту через провод. Это имеет небольшое подмножество свойств от объекта.
- Клиент отправляет обратно измененный DTO
- Сопоставьте свойства DTO с соответствующей единицей, чтобы оператор UPDATE мог быть сгенерирован и выполнен NH.
- Сохранить сущность
Точка 4 - вот где у меня проблема. В настоящее время я могу добиться этого обновления с помощью метода session.Merge (), однако он должен сначала загрузить сущность из БД (предположим, нет 2LC) перед обновлением. Таким образом, выполняются операторы select и update.
Что я хотел бы сделать, это создать временный экземпляр сущности, сопоставить новые значения из DTO, а затем заставить NH сгенерировать оператор SQL, используя только те свойства, которые я изменил. Дополнительный выбор не требуется, поскольку у меня уже есть идентификатор объекта и значения, необходимые для предложения SET. Возможно ли это в NH?
В настоящее время с помощью 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, похожий на UPDATE Persons SET Firstname = "Bob" WHERE PersonID = 1 '. Вместо этого я получаю исключение DateTime вне диапазона из-за того, что BirthDate не инициализируется. Для него не требуется дата рождения, так как он не требуется для оператора SQL. Может быть, это невозможно?
== / РЕДАКТИРОВАТЬ ==
Заранее спасибо,
John