Можно ли сохранить новую сущность (в моем случае secondEntity) в прослушивателе событий PreInsert в родительской транзакции (при сохранении в моем случае primaryEntity)?
Я хочу, чтобы они оба выполнялись в одной транзакции, это означает, что при сбое primaryEntitysave я не хочу сохранять secondEntity, когда сбой secondEntity, я не хочу сохранять primaryEntity. Обе сущности должны существовать в БД.
Код прослушивателя моего события
public async Task<bool> OnPreInsertAsync(PreInsertEvent @event, CancellationToken cancellationToken)
{
using (var innerSession = @event.Session.SessionWithOptions().Connection().OpenSession())
{
var secondEntity = new Entity();
await innerSession.SaveAsync(secondEntity);
}
return false;
}
В этой ситуации secondEntity не сохраняется в базе данных.
Когда я добавляю в конце строки события:
await innerSession.FlushAsync()
затем secondEntity сохраняется, но вставка firstEntity может завершиться неудачно, тогда мои данные не соответствуют друг другу, поскольку в БД присутствует только одна сущность.
Когда я пытаюсь: await @event.Session.SaveAsync(secondEntity)
, тогда я получаю ошибку:
System.InvalidOperationException : Collection was modified; enumeration operation may not execute.
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at NHibernate.Engine.ActionQueue.ExecuteActionsAsync(IList list, CancellationToken cancellationToken)
at NHibernate.Engine.ActionQueue.ExecuteActionsAsync(CancellationToken cancellationToken)
at NHibernate.Engine.ActionQueue.ExecuteActionsAsync(CancellationToken cancellationToken)
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutionsAsync(IEventSource session, CancellationToken cancellationToken)
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlushAsync(FlushEvent event, CancellationToken cancellationToken)
at NHibernate.Impl.SessionImpl.FlushAsync(CancellationToken cancellationToken)
at NHibernate.Impl.SessionImpl.BeforeTransactionCompletionAsync(ITransaction tx, CancellationToken cancellationToken)
at NHibernate.Transaction.AdoTransaction.CommitAsync(CancellationToken cancellationToken)