вставить примечание автоматически вставить продукт - лучший метод для таких случаев? - PullRequest
1 голос
/ 15 августа 2011

Я спрашиваю, чтобы узнать, что является наилучшей практикой для таких случаев. Я использую EF4.

У меня есть две сущности, которые называются «Примечание» и «Продукт». У меня есть еще один объект под названием "Фондовый".
Примечание имеет много продуктов, и каждый продукт может быть только в одной заметке (продукт должен иметь примечание).
Всякий раз, когда я вставляю, удаляю или обновляю продукт, я должен обновлять соответствующий объект акции в соответствии с примечанием, прилагаемым к продукту.

В методе InsertProduct () я вставляю Product, а затем обновляю соответствующий Stock. В случае, если Продукт нарушает правила складирования - я получаю исключение, и операция будет прервана, как и должно быть.

В методе InsertNote () я не могу вставить примечание, потому что оно автоматически вставит прикрепленные продукты, и для каждого продукта мне нужно обновить запас и проверить правила запаса (как описано выше). Поэтому перед вставкой Заметки я перебираю все Продукты и вызываю InsertProduct (). После этого я вставляю записку.

Пока здесь два вопроса:

  1. Должны ли вещи быть такими? Нужно ли вручную вставлять каждый продукт, прежде чем вставить примечание? Как это решается с Факт Продукт должен быть прикреплен к существующему примечанию (во время вставка продуктов, примечание не было вставлено)?

  2. Куда следует поместить методы InsertNote () и InsertProduct ()? каждый из них имеет дело с нотами, продуктами и акциями. Должен ли я создать что-то вроде классов NoteService и ProductService или поместить их в один большой класс обслуживания?

В вопросе, который я задал здесь , я получил ответ, в котором описано, как создавать события, такие как OnBeforeInsert (). Удовлетворяет ли эта реализация моим потребностям обновить Stock после вставки Product?

1 Ответ

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

Я не совсем уверен, что полностью понимаю, что вы пытаетесь сделать, и что это значит для проверки правил акций и обновления запасов.Но кажется, что вы пытаетесь повторно использовать InsertProduct из InsertNote , когда вы не должны.

Похоже, InsertNote следует

  • проверьте все правила и обновите Акции соответственно (я предполагаю, что это означает загрузку акций в контекст из базы данных или присоединение их, если они где-то есть в памяти)
  • добавить новую заметку в контекст (которая добавит новые продукты, которые вы поместили в ее коллекцию ранее)
  • SaveChanges()

и InsertProduct следует

  • проверить / обновить запасы, как указано выше
  • добавить Product в Note Коллекция Product
  • SaveChanges()

Другими словами, оба этих метода будут использовать только часть проверки правил. InsertProduct может быть лучше переименовано в UpdateProductsOfNote , поскольку оно звучит как Примечание - это совокупный корень вашей модели (в DDD , вы выполняете операции персистентности / хранилища для агрегата).

Относительно того, где эти методы живут, если они не слишком сложны, добавьте их в класс доступа к хранилищу / данным (которому принадлежит объект контекста EF).) было бы хорошо.Похоже, у них довольно много правил, связанных с ними.Если это так, какой-то доменный сервис, вероятно, будет лучшим выбором.Кажется, что большинство правил не просто для поддержки настойчивости.Если вы переместили эти методы, вам может не понадобиться обрабатывать события ObjectContext, как вы просили в посте, на который вы ссылались.

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