【发布时间】:2014-02-07 14:58:50
【问题描述】:
我正在尝试设置一个项目以使用断开连接的实体并将我的 DbContext 封装在“存储库”类中。每个断开连接的实体都有一个本地属性来远程跟踪它们的状态,并在传入时由存储库解析以相应地设置 EntityState 属性。
我的问题是关于更新对象图中的子对象。我应该使用接受经常更新实体的更新方法来设置存储库,还是应该在对象图中为父对象设置一个更新方法并附加/更新它。
举例
public class Company {
public int CompanyId { get; set; }
public string CompanyName { get; set; }
public ICollection<Department> { get; set; }
public LocalEntityState LocalEntityState { get; set; } // Enum for tracking disconnected changes
}
public class Department {
public int DepartmentId { get; set; }
public int CompanyId { get; set; }
public string DepartmentName { get; set; }
public Company Company { get; set; }
public ICollection<Employee> Employees { get; set; }
public LocalEntityState LocalEntityState { get; set; }
}
public class Employee {
public int EmployeeId { get; set; }
public int DepartmentId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Department Department { get; set; }
public LocalEntityState LocalEntityState { get; set; }
}
如果我使用单一方法来更新处于插入/更新状态的实体的整个对象图,我可以使用类似于以下界面的内容。不过需要注意的是,如果我要更新员工信息,我需要始终加载公司和部门的实例。
public interface ICompanyRepository {
void InsertOrUpdate(Company company)
// Other methods for deletion, retrieval, etc..
}
或者我可以使用类似的方法,为在 DbContext 中更改的“主要”对象提供方法。这样,如果我想编辑/插入它们,我只需要在内存中有一个 Employee 实例。
public interface ICompanyRepository {
void InsertOrUpdate(Company company);
void InsertOrUpdate(Department department);
void InsertOrUpdate(Employee employee);
}
我只是想听听其他人对此的看法,以及避免一些常见陷阱的最佳途径是什么。对于我的实际项目,我尝试将较大的 DbContext 拆分为“有界上下文”的较小子集(来自 Julie Lerman 的“企业中的实体框架”),以便每个存储库都可以使用一组相关实体。但我不确定更新这些实体的最佳方法。谢谢你的帮助。
【问题讨论】:
标签: c# entity-framework domain-driven-design repository-pattern