我正在尝试将我的 DbContext 与我目前使用的 winforms 应用程序分开,以更好地支持多用户环境以及即将推出的网站。在做了一些研究之后,我打算为 winforms 应用程序/网站实现数据访问层 (DAL) 以连接到并让最终用户使用断开连接的实体。我的问题是,当子集合中的一个实体已更新时,我将如何保存对我的实体的更新。
例如,如果我有以下结构(简化)
public class Company
{
public int CompanyID { get; set; }
public string CompanyName { get; set; }
public ICollection<Employee> Employees { get; set; } // Non-virtual as we aren't lazy-loading
}
public class Employee
{
public int CompanyID { get; set; }
public int EmployeeID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<Claim> Claims { get; set; }
}
public class Claim
{
public DateTime ClaimDate { get; set; }
public ICollection Documentation { get; set; }
}
public class Document
{
public byte[] DocumentImage { get; set; }
public string Name { get; set; }
public DateTime CreateDate { get; set; }
}
在 winforms 应用程序中,我设置了多个 Binding Source 来显示员工的信息
例如:
employeeBinding.DataSource = typeof(Employee); // Eventually set to an IEnumerable<Employee>
claimBinding.DataSource = employeeBinding;
claimBinding.DataMember = "Claims";
documentationBinding.DataSource = claimBinding;
documentationBinding.DataMember = "Documentation";
但是,通过像这样进行设置,我无法调用每个绑定源的“CurrentChanged”事件来保存每个实体,因为它已经更改(除非我在表单中存储了对前一个实体的引用)。所以我想做的是类似于下面的 DAL 并遍历每个子集合。
public void UpdateEmployee(Employee employee)
{
using (myContext context = new myContext())
{
context.Employees.Attach(employee);
context.Entry<Employee>(employee).State = EntityState.Modified;
foreach(var claim in employee.Claims)
{
context.Entry<Claim>(claim).State = EntityState.Modified;
foreach(var doc in claim.Documentation)
{
context.Entry<Document>(doc).State = EntityState.Modified;
}
}
context.SaveChanges();
}
}
然而,我觉得这条路线可能会因为一些更复杂的实体和关系而变得丑陋。有人可以帮我指出处理这个问题的最佳途径,还是我应该在代码中引用当前实体,以便当“CurrentChanged”事件触发时我可以更新每个单独的实体?
非常感谢。