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 タイプにカスケードされます。それがナッツです。ロギング要件のため、ラムダやその他の派手な構造を使用できません。foreach または for ループでこれを修正するには、hep が必要です。
編集:
予想どおり、同じコード構造がアプリケーションの別の場所で機能します。最後のアイテムのプロパティが他のアイテムのプロパティに影響を与えて更新されません。
ハックなアプローチを使用してこれを解決しました:
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);
}
しかし、このインスタンスで機能しない理由をまだ説明できません。