using (var tx = session.BeginTransaction(IsolationLevel.Serializable))
{
bool alreadyExists = session.Query<MyEntity>()
.Any(x => x.UniqueProp = newEntity.UniqueProp);
if (!alreadyExists)
session.Save(newEntity)
tx.Commit();
}
Уровень изоляции Serializable
гарантирует, что никто не сможет вставить соответствующую строку между запросом и вставкой. Конечно, недостатком является снижение параллелизма из-за блокировок диапазона.
Обработка исключения является альтернативой.