Использование отдельного файла класса (модели) для запросов Entity Framework вместо записи в самом контроллере - PullRequest
0 голосов
/ 22 января 2020

Можно ли писать запросы EF в отдельном файле классов внутри папки моделей вместо записи в самом контроллере.

Потому что я видел в msdn запись всех запросов EF в самом контроллере. В то же время я также прочитал в msdn, что контроллер должен быть коротким.

При использовании моделей я использую этот подход:

В контроллере:

        public JsonResult SaveStorageLocation(StorageLocations objStorageLocation)
        {
            int Result = 0;
            try
            {
                StorageLocationModel objStorageLocationModel = new StorageLocationModel();
                if (objStorageLocation.Id == Guid.Empty)
                {
                    Result = objStorageLocationModel.AddStorageLocation(objStorageLocation, SessionUserId);
                }
                else
                {
                    Result = objStorageLocationModel.UpdateStorageLocation(objStorageLocation, SessionUserId);
                }
            }
            catch (Exception ex)
            {
                Result = (int)MethodStatus.Error;
            }
            return Json(Result, JsonRequestBehavior.AllowGet);
        }

В классе Model:

public int AddStorageLocation(StorageLocations objStorageLocation, Guid CreatedBy)
        {
            MethodStatus Result = MethodStatus.None;
            int DuplicateRecordCount = db.StorageLocations.Where(x => x.Location.Trim().ToLower() == objStorageLocation.Location.Trim().ToLower()).Count();
            if (DuplicateRecordCount == 0)
            {
                objStorageLocation.Id = Guid.NewGuid();
                objStorageLocation.CreatedBy = CreatedBy;
                objStorageLocation.CreatedOn = DateTime.Now;
                objStorageLocation.ModifiedBy = CreatedBy;
                objStorageLocation.ModifiedOn = DateTime.Now;
                objStorageLocation.Status = (int)RecordStatus.Active;
                db.StorageLocations.Add(objStorageLocation);
                db.SaveChanges();
                Result = MethodStatus.Success;
            }
            else
            {
                Result = MethodStatus.MemberDuplicateFound;
            }
            return Convert.ToInt32(Result);
        }

        public int UpdateStorageLocation(StorageLocations objStorageLocationNewDetails, Guid ModifiedBy)
        {
            MethodStatus Result = MethodStatus.None;
            int DuplicateRecordCount = 
                db.StorageLocations.
                Where(x => x.Location == objStorageLocationNewDetails.Location && 
                x.Id != objStorageLocationNewDetails.Id).Count();
            if (DuplicateRecordCount == 0)
            {
                StorageLocations objStorageLocationExistingDetails = db.StorageLocations.Where(x => x.Id == objStorageLocationNewDetails.Id).FirstOrDefault();
                if (objStorageLocationExistingDetails != null)
                {
                    objStorageLocationExistingDetails.Location = objStorageLocationNewDetails.Location;
                    objStorageLocationExistingDetails.ModifiedBy = ModifiedBy;
                    objStorageLocationExistingDetails.ModifiedOn = DateTime.Now;
                    objStorageLocationExistingDetails.Status = (int)RecordStatus.Active;
                    db.SaveChanges();
                    Result = MethodStatus.Success;
                }
            }
            else
            {
                Result = MethodStatus.MemberDuplicateFound;
            }
            return Convert.ToInt32(Result);
        }

Или лучше написать весь код в самом контроллере?

Ответы [ 2 ]

1 голос
/ 22 января 2020

Вы хотите, чтобы ваш код всегда был тестируемым.

Никогда не помещайте logi c в свои модели, размещение логических элементов в папке модели сделает вашу структуру грязной и упростит потерю обзора.

Вы должны использовать класс репозитория, который реализует интерфейс. В классе репозитория вы можете выполнить EF logi c, перехватить исключения из базы данных и т. Д.

В ваш контроллер будет добавлен интерфейс репозитория. Таким образом, вы можете проверить свой контроллер отдельно от EF logi c, потому что вы можете издеваться над этим интерфейсом. Ваш репозиторий также будет тестироваться на предмет его функциональности.

1 голос
/ 22 января 2020

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

Если оставить в стороне, есть много преимуществ, если у вас нет запросов в контроллере.

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