Отображение NHibernate на «денормализованную» таблицу - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть следующая объектная модель (основанная на устаревшей структуре таблиц, которую я не могу изменить).

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]

1 Ответ

0 голосов
/ 07 февраля 2012

Вам необходимо настроить каскад для этих ссылок на Save-Update.Это означает, что когда вы сохраняете или обновляете объект, он сохраняет ссылки «по каскаду».

http://wiki.fluentnhibernate.org/Getting_started

В разделе Mappings есть пример скаскад.

...