Скажем, у меня есть некоторый стандартный код NHibernate, подобный этому, который записывает в базу данных SQL:
using (var session = SessionFactory.OpenSession())
{
using (var tx = session.BeginTransaction())
{
var customer = session.Get<Customer>(id);
customer.Property1 = "new value";
customer.Property2 = "new value";
tx.Commit();
}
}
Я пытаюсь создать таблицу копирования для Клиента (в базе данных NoSQL). Поэтому при выполнении кода выше запускается следующий обработчик событий:
public void OnPostUpdate(PostUpdateEvent postUpdateEvent)
{
if (postDeleteEvent.Entity.GetType() == typeof(Customer))
{
var customer = (Customer)postUpdateEvent.Entity;
customerCopyRepository.Update(customer);
}
}
Если бы я изменил первый фрагмент кода на вставку, то это запустилось бы:
public void OnPostInsert(PostInsertEvent postInsertEvent)
{
if (postInsertEvent.Entity.GetType() == typeof(Customer))
{
var customer = (Customer)postInsertEvent.Entity;
customerCopyRepository.Insert(customer);
}
}
и когда происходит удаление, запускается:
public void OnPostDelete(PostDeleteEvent postDeleteEvent)
{
if (postDeleteEvent.Entity.GetType() == typeof(Customer))
{
var customer = (Customer)postDeleteEvent.Entity;
customerCopyRepository.Delete(customer.Id);
}
}
CustomerCopyRepository внедряется в конструктор класса.
Это работает очень хорошо. Единственная проблема, с которой я столкнулся, заключается в том, что каждое из указанных выше событий, по-видимому, запускается до того, как данные передаются в базу данных. Поэтому может произойти следующий сценарий:
1) Запись клиента в базу данных NoSQL.
2) Клиент не записан в базу данных SQL (из-за ошибки SQL).
Можно ли как-нибудь предотвратить этот сценарий?