Fluent NHibernate: строки с заданным идентификатором не существует. Ошибка возникает, когда 2 пользователя удаляют некоторый элемент

#c#-4.0 #fluent-nhibernate

#c #-4.0 #fluent-nhibernate

Вопрос:

Fluent NHibernate: строки с заданным идентификатором не существует.

У меня есть объект, у которого есть коллекция элементов. Моя проблема в том, что ошибка возникает, когда 2 пользователя видят объект, а один пользователь удаляет какой-либо элемент. Другой пользователь должен увидеть обновленный объект без удаленного элемента, а не исключение.

Я попытался:

 session.Evict(p);
// the following line will throw an exception 
session.Refresh(p);

No row with the given identifier exists[Sistema.ERPxx.Pedidos.ItemPedido#74435]
  

В сопоставлении указано:

 this.HasMany<ItemPedido>(v => v.Items).KeyColumn("numero_pedido").Cascade.All().OrderBy("descricao_produto").LazyLoad().NotFound.Ignore();
  

Я столкнулся с этой проблемой и не знаю, как обновить элемент, чтобы получить обновления, которые сделал другой пользователь.

Как обновить объект элементами, не получая исключения?

Ответ №1:

на самом деле хорошо, что вы получаете это исключение. это то, что называется оптимистичным параллелизмом (погуглите это; вот достаточно простое объяснение).
что вам нужно сделать, так это перехватить это исключение и перевести его в какой-нибудь понятный пользователю формат. например:

 catch (WhateverConcurrencyException ex)
{
   throw new UserReadableException("The object with id " id " no longer exists");
}
  

Комментарии:

1. Я хочу, чтобы в этом случае не было исключения, потому что ожидается исчезновение строки. Поскольку пользователь отредактировал и удалил некоторые неиспользуемые строки, другой пользователь должен увидеть без каких-либо ошибок новый объект с текущими элементами. Как я могу это сделать? Обновить объект без исключения?