Как обновить десериализованную сущность с помощью NHibernate? - PullRequest
0 голосов
/ 16 сентября 2010

Допустим, у меня есть такая сущность:

public class Product
{
    public virtual int Id { get; set; }
    public virtual int Name { get; set; }
}

Клиент хочет обновить имя определенного продукта, поэтому он отправляет этот JSON обратно на сервер ASP.NET:

{
    "Id": 1,
    "Name": "Updated Product Name"
}

Затем я запускаю этот код, чтобы попытаться сохранить его:

var jsonString = GetJsonStringFromRequestBody();
var product = JsonNet.Deserialize<Product>(jsonString);

using (var session = SessionFactory.OpenSession())
{
    session.Update(product);
}

К сожалению, я получаю следующее исключение:

NHibernate.StaleObjectStateException: строка была обновлена ​​илиудален другой транзакцией (или сопоставление несохраненного значения было неверным)

Теперь я мог бы использовать следующий код:

var jsonString = GetJsonStringFromRequestBody();
var productToUpdate = JsonNet.Deserialize<Product>(jsonString);

using (var session = SessionFactory.OpenSession())
{
    var productFromDB = session.Linq<Product>().Single(x => x.Id == productToUpdate.Id);
    productFromDB.Name = productToUpdate.Name;
}

Но, к сожалению, для этого требуется вручную копировать каждыйсобственность от десериализованного объекта к персистентному.Есть ли более простой или лучший способ сделать это?

1 Ответ

1 голос
/ 16 сентября 2010

Извлечение из БД и обновление - самый безопасный способ. Вы можете использовать рефлексию, если хотите писать меньше кода.

Кстати, использование Linq для выбора по id - пустая трата времени: вместо этого используйте session.Get<Product>(id).

...