Необходимо сделать несколько улучшений.
Метод Save () - Не копируйте слева направо, используйте встроенную логику EF
Вместо этого:
myEmp.Employee_ID = emp.Employee_ID;
myEmp.First_Name = emp.First_Name;
myEmp.Middle_Name = emp.Middle_Name;
myEmp.Last_Name = emp.Last_Name;
myEmp.Supervisor_ID = emp.Supervisor_ID;
myEmp.Active = emp.Active;
myEmp.Is_Supervisor = emp.Is_Supervisor;
Вы можете сделать это:
ctx.Employees.ApplyCurrentValues(emp)
.
Что это делает, так это ищет сущность с тем же ключом в графе (который существует, поскольку вы только что получили его с помощью FirstOrDefault()
), и переопределяете скалярные значения передаваемой вами сущностью - именно то, что вы делаете.
Таким образом, ваши 7 строк становятся 1, плюс, если вы добавите какие-либо дополнительные скалярные свойства - вам не придется рефакторинг вашего кода. Только помните - работает только для скалярных свойств , а не навигационных свойств .
Зачем строить запрос для поиска первичного ключа? Просто используйте предикат для SingleOrDefault ()
Вместо этого:
var results = from item in ctx.Employees
where item.ID == emp.ID
select item;
var myEmp = results.FirstOrDefault();
Сделайте это:
var myEmp = ctx.Employees.SingleOrDefault(x => x.ID == emp.Id);
Или, что еще лучше, используйте трубу / фильтр Техника:
var myEmp = ctx.Employees.WithId(emp.Id).SingleOrDefault();
Где WithId
- метод расширения IQueryable<Employee>
, который фильтрует запрос на основе предоставленного идентификатора сотрудника. Это позволяет отсоединить фильтрацию / бизнес-логику от вашего хранилища / DAL. Он должен соответствовать вашей модели домена, поэтому вы можете иметь хороший свободный API для запроса сущностей вашего домена через ORM.
Когда вы извлекаете сущность с помощью первичного ключа, вы должны всегда использовать SingleOrDefault()
или Single()
, никогда FirstOrDefault()
или First()
. Если это первичный ключ - должен быть только один из них, поэтому вы должны выбросить исключение, если существует более одного, что и делает SingleOrDefault()
. И, как упоминает @Shiraz, ваш FirstOrDefault()
приведет к сбою запроса ниже. При использовании <First/Single>OrDefault()
.
вам всегда нужна проверка на ноль.
Те же улучшения могут быть сделаны в вашем методе Get.
В целом, нет ничего функционально неправильного в вашем коде - он просто нуждается в незначительных улучшениях, нулевой проверке и обработке исключений.
Единственное функциональное улучшение, которое я настоятельно рекомендую , - это преобразование кода вашего веб-сервиса в общий репозиторий. Поскольку код очень тривиален и может быть повторно использован для любого объекта. Веб-сервис не должен касаться транзакций, первичного ключа или логики EF. Там даже не должно быть ссылки на EF DLL. Инкапсулируйте эту логику в хранилище и делегируйте ей логику постоянства (конечно, через интерфейс).
После внесения изменений, о которых я упоминал выше, методы веб-службы должны содержать не более 5-7 строк кода.
У вас слишком много интеллекта в вашем веб-сервисе - он должен быть тупым и упорным невежественным.