0

我看到很多关于 foreach 集合引用类型属性更新的示例,但并不是我正在努力解决的问题。如果要更新引用类型项的属性的属性怎么办?像这样:

 public class Employee
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public EmployeeType EmpType { get; set; }
    }

    public class EmployeeType
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class Class1
    {
        private IList<Employee> existingEmp;

        public void edit()
        {
            var dbEmployees = GetExistingEmployees();

            IList<Employee> employees = new List<Employee> { 
                new Employee{ Id = 1, Name="me", EmpType = new EmployeeType { Id = 1}}, 
                new Employee{ Id = 2, Name="me again", EmpType = new EmployeeType { Id = 2}}
            };

            foreach (var emp in employees)
            {
                foreach (var oldEmp in dbEmployees)
                {
                    if (emp.Id == oldEmp.Id)
                    {
                        UpdateChanges(emp, oldEmp);
                        existingEmp.Add(oldEmp);
                    }
                }
            }
        }        

        private void UpdateChanges(Employee emp, Employee oldEmp){
            if (oldEmp.EmpType.Id != emp.EmpType.Id)
            {
                LogChange();
                oldEmp.EmpType.Id = emp.EmpType.Id;
            }
        }

        private void LogChange()
        {
            throw new NotImplementedException();
        }

        //data access layer
        public IList<Employee> GetExistingEmployees()
        {
            throw new NotImplementedException();
        }
    }

这里的问题是集合中的最后一个员工,如果他/她的员工类型属性 Id 在 ddl 中更改,更新它将级联到集合中所有其他员工的 emp 类型。那是疯子。由于日志记录的要求,我不能使用 lambda 或其他花哨的构造。我需要在 foreach 或 for 循环中解决这个问题。

编辑:

正如预期的那样,相同的代码结构在我的应用程序的其他地方工作。我没有让最后一个项目的属性更新到其他项目的属性。

我使用一种hacky方法解决了这个问题:

private void UpdateChanges(Employee emp, Employee oldEmp){
    var oldEmpTemp = GetEmployeeById(oldEmp.Id);

    if (oldEmp.EmpType.Id != emp.EmpType.Id)
    {
        LogChange();
        oldEmpTemp.EmpType.Id = emp.EmpType.Id;
    }
    //instead of updating the collection items
    // and bulk updating in the db, update directly in the db
    UpdateEmployee(oldEmpTemp);    
}

但仍然无法解释为什么它不适用于这种情况。

4

0 回答 0