У меня есть следующая объектная модель (основанная на устаревшей структуре таблиц, которую я не могу изменить).
public class Store
Contact BillingContact {get;set;}
Contact SetupContact {get;set;}
ISet<Contact> Contacts {get;set;}
В этом случае, когда я создаю новый Магазин, я также добавляю новый контакт в список контактов. Я также хочу, чтобы этот контакт был ссылкой в BillingContact и SetupContact. Затем сохраните лот как одну транзакцию. Если я сохраню магазин, не установив ссылки на BillingContact и SetupContact, все в порядке. Но когда я устанавливаю эти свойства, NHibernate пытается выполнить обновление после вставки, чтобы обновить ссылки, и я получаю сообщение об ошибке, потому что хранилище еще не было вставлено.
Похоже, мне, возможно, придется использовать триггер или сохраненный процесс, но я надеюсь, что есть способ NHibernate.
Запускаемый SQL:
INSERT INTO CONTACTS (Id, CompanyId, Name, etc.) Values (1234, NULL, "My Contact", etc.) NOTE: 1234 was retrieved from a sequence
Тогда
INSERT INTO company (Id, BillingContactId, SetupContactId) Values (8946, 1234, 1234)
Тогда - ошибка из-за этого
UPDATE CONTACTS SET CompanyId=8946 WHERE CUSTOMER_ID = 1234 AND TimeStamp = xxx
Так как вставка не была зафиксирована, завершающий оператор завершается ошибкой.
Ошибка
Строка была обновлена или удалена другой транзакцией (или сопоставление несохраненного значения было неправильным) [Клиент # 1234]