FluentNHibernate в базе данных Oracle, обнуляемый иностранный ключ (Классическая проблема?) - PullRequest
1 голос
/ 10 октября 2011

Я немного застрял.

Проблема

NHibernate заставляет меня сделать столбец Foreignkey обнуляемым, что является очень плохой идеей для нашей базы данных идовольно некрасиво

Есть ли способ обойти это?

Ситуация

У меня есть следующие карты (имена изменены для простоты):

public class BillMap : SequenceGeneratedIdEntityMap<Bill>
{
   public BillMap()
   {
           Id(x => x.Id).GeneratedBy.Native("BILL_SEQ");
           ... (maps) ...
           HasMany<Expense>(f => f.Expense)
            .Schema("ACCOUNT")
            .Table("EXPENSE")
            .KeyColumn("BILL")
            .Cascade.All();
   }
}

public class ExpenseMap : SequenceGeneratedIdEntityMap<Expense>
{
   public ExpenseMap ()
   {
      Id(x => x.Id).GeneratedBy.Native("EXPENSE_SEQ");
      ... (maps) ...
   }
}

Используя эти карты, я получаю следующее от NHibernate при сохранении экземпляра Билла:

select ACCOUNT.BILL_SEQ.nextval from dual
select ACCOUNT.EXPENSE_SEQ.nextval from dual

command 0:INSERT INTO ACCOUNT.BILL(...)
command 0:INSERT INTO ACCOUNT.EXPENSE(...)
command 0:UPDATE UPDATE.EXPENSE SET BILL = X WHERE ...

Обратите внимание на 2 вещи здесь:

  1. Все идентификаторы запрашиваютсяиз последовательностей ДО вставки.
  2. Иностранный ключ не обновляется, пока ПОСЛЕ не будет добавлен расход.

Это вынуждает меня сделать столбец обнуляемым И разрешить обновления таблицы.

В идеале оператор обновления не должен быть необходим и обрабатывает какое-то глубокое темное место внутри NHB :).

Эту проблему можно решить с помощью двунаправленной ссылки, но это разрушит мою модель: /.

Я верю, что это возвращающаяся проблема для меня (никогда прежде не находил хорошего решения).Есть кто-нибудь, кто знает об обходном пути?

С уважением

1 Ответ

0 голосов
/ 11 октября 2011

Установив .Inverse() на вашем HasMany<Expense> вызове, NHibernate будет знать, какая сторона является родительским объектом.Я считаю, что это поменяет порядок вставок.

Для получения дополнительной информации:

http://wiki.fluentnhibernate.org/Getting_started#Mappings

Обратный атрибут в NHibernate

...