nhibernate преобразовать сущность из одного типа в другой: как обрабатывать коллекции? - PullRequest
0 голосов
/ 07 августа 2011

У меня ситуация, очень похожая на описанную в этот вопрос :
Engineer и Manager оба наследуются от Contact, а Engineer могут быть повышены (или понижены в зависимости от вашей перспективы) до Manager.

разница в том, что я регистрирую все заказы, представленные контактом.
смысл - мой класс Contact имеет свойство IList<Order> Orders, которое может состоять из 100 000 заказов. (прежде чем спросить - очевидно, это свойство никогда не загружается в память, это просто противоположный конец свойства Contact OrderSubmitter Order).

Мне нравится идея «конструктора копирования», предложенная @Jamie Ide.
вопрос в том, могу ли я изменить ссылку на объекты Order, не загружая их в память?

[EDIT]
да, я могу использовать обновление HQL .
Однако это создает другую проблему - я пытаюсь создать сущность, и другие сущности ссылаются на нее в той же транзакции. значение:

Manager manager = new Manager(engineer);
session.Save(manager);
session.CreateQuery("update Order set OrderSubmitter = :manager where OrderSubmitter = :engineer")
  .SetParameter("manager",manager)
  .SetParameter("engineer",engineer)
   .ExecuteUpdate();
session.Transaction.Commit();

однако - ExecuteUpdate происходит немедленно, тогда как сущность Manager сохраняется только в 'commit'.
Это, конечно, приводит к исключению внешнего ключа.
Я могу обойти это путем явного вызова session.Flush() сразу после вызова Save(manager), но это не очень хорошая практика.

есть идеи?

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Настоящая проблема в том, что ваше моделирование неверно.В ОО объект не меняет своего типа.Менеджер / Инженер должен быть смоделирован как отношение один-к-одному.Вы можете иметь класс задания в качестве свойства компонента Employee.Затем, когда сотрудник повышается от инженера до менеджера, вам нужно только заменить компонент.Также - вам не придется обновлять таблицу заказов, так как отправитель остается прежним.Единственное отличие состоит в его компоненте работы

0 голосов
/ 07 августа 2011

Как вы заявили, проблема в том, что ExecuteUpdate () происходит немедленно и не выдается после вставки нового менеджера.Я думаю, что вызов session.Flush () немедленно является правильным решением.Вам также следует удалить исходный инженерный объект в той же транзакции.

См. Также ответ на этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...