Используя nhibernate, чтобы удалить сущность с деталями cascade-delete-orphan, почему мне нужно получить сущность со всеми деталями, чтобы удалить их тоже? - PullRequest
1 голос
/ 27 октября 2010

Допустим, у меня есть следующие объекты:

public class Order
{
  public int OrderID {get;set;};
  public int Version {get;set;};

public IList<OrderDetail> Details {get;set;}
}

public class OrderDetail
{
  public int OrderDetailID {get;set;}
  /// Some other properties
}

Когда я хочу удалить объект следующим образом:

 Order order = new Order { OrderID = 9, Version =1 };
 ITransaction tr = Session.BeginTransaction();
 Session.Delete(order);
 tr.Commit();

Хорошо, заказ удален, но детали все еще там с внешним ключом (OrderID), установленным в нуль, но когда я пытаюсь удалить его, как это, он работал как ожидалось:

 Order order = Session.Get<Order>(9);
 ITransaction tr = Session.BeginTransaction();
 Session.Delete(order);
 tr.Commit();

Почему я должен получить всю сущность из базы данных, чтобы удалить ее?

Кстати: я попытался создать экземпляр Order и вручную заполнить информацию и подробную информацию, это также сработало

Разве я не могу сделать это настолько просто, насколько это возможно?

1 Ответ

1 голос
/ 28 октября 2010

Во-первых, вы идете вразрез с принципами NHibernate с этим подходом.См. Ответ Айенде (он является одним из главных разработчиков) на этот вопрос в этой теме )

Если вы используете версионирование NHibernate (похоже, что вы из-за наличия этогоСвойство версии), тогда вам все равно придется получить элемент Order из базы данных, поскольку он не должен позволять вам удалять без предоставления правильного номера версии и как вы узнаете его без проверки базы данных?

Идеяниже может работать:

Создать ссылку на сущность Order способом "NHibernate".Правильный способ ссылки на постоянную сущность без вызова базы данных - использовать функцию Session.Load.Это вернет прокси-объект рассматриваемой сущности, который может гидратироваться из базы данных при необходимости.Вам нужно будет заменить эту строку:

Order order = new Order { OrderID = 9, Version =1 };

на

Order order = Session.Load<Order>(9);

Вам нужно будет проверить с помощью профилировщика или регистратора, чтобы увидеть, был ли ордер на самом деле повторно скопирован из базы данных в этомэкземпляр (который, честно говоря, я думаю, что будет).

...