public IEnumerable <Employee_dto> GetEmployeesByDepartment(Guid departmentID, string connectionString)
        {
            try
            {
                using (var db = TestDBEntities.FactoryMethod(connectionString))
                {
                    var t = db.Set <Employee>().Where(e => e.DepartmentID == departmentID).AsNoTracking()
                            .ProjectTo <Employee_dto>(new MapperConfiguration(cfg => cfg.AddProfile <MapperProfile>()))
                            .ToArray();

                    _loger.Info("Запрошен список сотрудников подразделения " + departmentID + ". Строка подключения: " + db.Database.Connection.ConnectionString);
                    return(t);
                }
            }
            catch (DataException ex)
            {
                _loger.Warn(ex, "Проблема при получении списка сотрудников по GUID подразделения: " + departmentID);
                var fault = GetExceptionMessage(ex);
                throw new FaultException <DefaultFault>(fault);
            }
            catch (Exception ex)
            {
                _loger.Error(ex, "Во время получения сотрудников подразделения произошла ошибка.");
                throw;
            }
        }
        public int AddEmployee(Employee_dto employee, string connectionString)
        {
            try
            {
                using (var db = TestDBEntities.FactoryMethod(connectionString))
                {
                    var entity = mapper.Map <Employee>(employee);
                    db.Set <Employee>().Add(entity);
                    db.SaveChanges();

                    _loger.Info("Добавлен сотрудник " + entity.ID + " в подразделение " + employee.DepartmentID + ". Строка подключения: " + db.Database.Connection.ConnectionString);
                    return(entity.ID);
                }
            }
            catch (DataException ex)
            {
                _loger.Warn(ex, "Проблема добавления сотрудника " + employee.ToJson());
                var fault = GetExceptionMessage(ex);
                throw new FaultException <DefaultFault>(fault);
            }
            catch (Exception ex)
            {
                _loger.Error(ex, "Во время добавления сотрудника что-то пошло совсем не так.");
                throw;
            }
        }
        public IEnumerable <Department_dto> GetDepartmentStructureWithEmployees(string connectionString)
        {
            try
            {
                using (var db = TestDBEntities.FactoryMethod(connectionString))
                {
                    var t      = db.Department.Include(el => el.Employee).Where(d => !(d.ParentDepartmentID.HasValue)).AsNoTracking().ToList();
                    var result = mapper.Map <IEnumerable <Department_dto> >(t);

                    _loger.Info("Запрошена структура предприятий. Строка подключения: " + db.Database.Connection.ConnectionString);
                    return(result);
                }
            }
            catch (DataException ex)
            {
                _loger.Warn(ex, "Проблема запроса структуры подразделений.");
                var fault = GetExceptionMessage(ex);
                throw new FaultException <DefaultFault>(fault);
            }
            catch (Exception ex)
            {
                _loger.Error(ex, "Во время запроса структуры подразделений произошла ошибка.");
                throw;
            }
        }
        public void DeleteDepartment(Department_dto department, string connectionString)
        {
            try
            {
                using (var db = TestDBEntities.FactoryMethod(connectionString))
                {
                    var entity = db.Set <Department>().Where(el => el.ID == department.ID).SingleOrDefault();

                    var t = db.Set <Department>().Remove(entity);
                    db.SaveChanges();

                    _loger.Info("Удалено подразделение " + department.ToJson() + ". Строка подключения: " + db.Database.Connection.ConnectionString);
                }
            }
            catch (DataException ex)
            {
                _loger.Warn(ex, "Проблема удаления подразделения " + department.ToJson());
                var fault = GetExceptionMessage(ex);
                throw new FaultException <DefaultFault>(fault);
            }
            catch (Exception ex)
            {
                _loger.Error(ex, "Во время удаления подразделения что-то пошло совсем не так.");
                throw;
            }
        }
        public void DeleteEmployee(Employee_dto employee, string connectionString)
        {
            try
            {
                using (var db = TestDBEntities.FactoryMethod(connectionString))
                {
                    var entity = mapper.Map <Employee>(employee);

                    db.Set <Employee>().Attach(entity);
                    var t = db.Set <Employee>().Remove(entity);
                    db.SaveChanges();

                    _loger.Info("Удален сотрудник " + employee.ToJson() + ". Строка подключения: " + db.Database.Connection.ConnectionString);;
                }
            }
            catch (DataException ex)
            {
                _loger.Warn(ex, "Проблема удаления сотрудника " + employee.ToJson());
                var fault = GetExceptionMessage(ex);
                throw new FaultException <DefaultFault>(fault);
            }
            catch (Exception ex)
            {
                _loger.Error(ex, "Во время удаления сотрудника что-то пошло совсем не так.");
                throw;
            }
        }
        public void EditDepartment(Department_dto department, string connectionString)
        {
            try
            {
                using (var db = TestDBEntities.FactoryMethod(connectionString))
                {
                    var entity = mapper.Map <Department>(department);

                    var originalEntity = db.Set <Department>().Where(el => el.ID == entity.ID).SingleOrDefault();
                    if (originalEntity == null)
                    {
                        throw new InvalidOperationException("Record is not found in storage");
                    }

                    db.Entry(originalEntity).CurrentValues.SetValues(entity);
                    db.SaveChanges();

                    _loger.Info("Отредактировано подразделение " + department.ID + ". Строка подключения: " + db.Database.Connection.ConnectionString);
                }
            }
            catch (DataException ex)
            {
                _loger.Warn(ex, "Проблема редактирования подразделения " + department.ToJson());
                var fault = GetExceptionMessage(ex);
                throw new FaultException <DefaultFault>(fault);
            }
            catch (Exception ex)
            {
                _loger.Error(ex, "Во время редактирования подразделения что-то пошло совсем не так.");
                throw;
            }
        }
        public Guid AddDepartment(Department_dto department, string connectionString)
        {
            try
            {
                using (var db = TestDBEntities.FactoryMethod(connectionString))
                {
                    var entity = mapper.Map <Department>(department);
                    entity.ID = Guid.NewGuid();
                    db.Set <Department>().Add(entity);
                    db.SaveChanges();

                    _loger.Info("Добавлено подразделение " + entity.ID + ". Строка подключения: " + db.Database.Connection.ConnectionString);
                    return(entity.ID);
                }
            }
            catch (DataException ex)
            {
                _loger.Warn(ex, "Проблема добавления подразделения " + department.ToJson());
                var fault = GetExceptionMessage(ex);
                throw new FaultException <DefaultFault>(fault);
            }
            catch (Exception ex)
            {
                _loger.Error(ex, "Во время добавления подразделения что-то пошло совсем не так.");
                throw;
            }
        }