Как создать однозначное сопоставление в NHibernate с помощью атрибутов сопоставления - PullRequest
1 голос
/ 25 марта 2011

Я пытаюсь создать сопоставление один-к-одному в своем приложении, я пробовал несколько примеров, которые я нашел в Stackoverflow и других местах, но пока безуспешно.

У меня есть класс заказа и класс бронирования. Несколько заказов могут существовать без резервирования, но резервирование всегда должно иметь заказ.

Мой план состоит в том, чтобы поместить FK в таблицу бронирования, а следующий код:

  class Order
  {
     ... 
     [OneToOne(Cascade = "all-delete-orphan")]        
     public Reservation Reservation
     {
        get;
        private set;
     }
  }

А класс бронирования:

 class Reservation
 {
    ...
    [ManyToOne(Column = "order_id", NotNull=true, Unique=true)]        
    public Order Order
    {
        get;
        set;
    }
 }

Это хорошо работает, но когда я пытаюсь удалить заказ:

session.Delete(myOrder);
session.FlushSession();

Я получаю исключение нарушения FK из-за того, что резервный FK равен нулю, но я ожидал, что резервирование будет автоматически удалено из-за параметра Cascade.

Есть предложения?

Спасибо

1 Ответ

0 голосов
/ 26 марта 2011

Я обнаружил проблему: при загрузке заказа он пытался найти резервирование с помощью предложения, например: "WHERE order.id = revervation.id", но на самом деле ему нужно было проверить FK в таблице резервирования: " ГДЕ order.id = booking.order_id "

Из-за этого резервирование никогда не загружалось должным образом, и когда заказ был удален, резервирование не было удалено, результатом было то, что заказ был удален из БД, и когда был выполнен сброс, ограничение FK было нарушено, потому что резервирование был все еще там.

Чтобы устранить проблему, я изменил код заказа на:

[OneToOne(Cascade="all-delete-orphan", ForeignKey="none", PropertyRef="Order", Lazy=Laziness.Proxy)]        
    public Reservation Reservation
    {
        get;
        private set;
    }

Обратите внимание на параметр "PropertyRef".

Спасибо

...