Рекомендации Entity Framework: Какой слой должен вызывать SaveChanges ()? - PullRequest
9 голосов
/ 16 января 2010

Для чистой модели данных, я собираюсь об этом ...

Используя в качестве примера рабочий процесс утверждения, скажем, в моем веб-приложении есть страница, которая позволяет пользователю пометить MyEntityObject для утверждения. MyEntityObject имеет несколько свойств, которые управляют его рабочим процессом утверждения, поэтому у меня есть общий служебный метод, называемый FlagForApproval(MyEntityObject eo).

Если page вызвать FlagForApproval () , чтобы установить только необходимые свойства, а затем вызвать SaveChanges () , когда он будет готов, или должен FlagForApproval ( ) сохранить изменения?

При использовании служебного метода сохранения изменений кажется, что он делает немного больше, чем его просят сделать (что, если это был всего лишь один шаг в серии операций?), Но в то же время создание страницы вызывает SaveChanges () и передача данных в БД может показаться слишком близкой к обязанностям уровня данных.

Мысли

(Обновление: FWIW, до сих пор у меня были служебные методы, вызывающие SaveChanges (), поэтому на странице есть только один набор исключений для обработки, будь то проверка или данные.)

Ответы [ 3 ]

2 голосов
/ 16 января 2010

Мое текущее мнение по этому вопросу - всегда сохранять вызов уровня бизнес-логики для сохранения изменений после проверки данных. Когда пользователь нажимает кнопку «Сохранить», я передаю все объекты, которые должны быть проверены, в BLL, и он решает, следует ли SaveChanges ().

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

1 голос
/ 16 января 2010

Ключом является разделение базы данных и языка обслуживания. Если служебный метод должен сохранить изменения, он делает, если не дает понять, что это не так, и необходимы дополнительные шаги. У утилиты не должно быть метода с именем SaveChanges, она должна иметь методы, связанные с процессом, такие как StartProcess или LoadToBatch.

Рассматривайте утилиту как сервис и не думайте о базе данных. «FlagForApproval» звучит как операция с базой данных, попробуйте представить метод как что-то вроде «StartApprovalProcess» или как-то еще связанный процесс. StartApprovalProcess будет выполнять всю работу и фиксировать.

Если есть несколько шагов, сделайте каждый шаг косвенно указывать, что может быть больше шагов. Только последний шаг фиксирует. Несмотря на то, что последний шаг может сохранить изменения, make читается как процесс, такой как перемещение или запуск.

Пример:

  1. LoadToBatchApproval (MyEntityObject eo)

  2. ValidateApprovalBatch () ...

  3. MoveBatchToProcessing () ...

0 голосов
/ 16 января 2010

Я не уверен, что есть правильный или неправильный ответ, но кажется более чистым (imo), чтобы FlagForApproval обрабатывал процесс запуска рабочего процесса. Это включает в себя указание DataLayer сохранить состояние объекта (т. Е. SaveChanges). Однако это предполагает, что у вас есть бизнес-требования, согласно которым после запуска рабочего процесса необходимо сохранить состояние, чтобы в случае чего-то (например, сбой сервера) процесс рабочего процесса продолжался с последнего шага.

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