考虑这个EF代码优先架构:
class Organization
{
public int ID { get; set; }
public ICollection<Employee> Employees { get; set; }
}
class Employee
{
public int ID { get; set; }
public Organization Employer { get; set; }
}
class MyDbContext: DbContext
{
public DBSet<Employee> Employees { get; set; }
public DBSet<Organization> Organizations { get; set; }
}
假设我们有一个组织实例,并希望添加一名新员工。 我们可以做(A)
organization.Employees.Add(new_guy);
或(B)
new_guy.Organization = organization;
dbContext.Employees.Add(new_guy);
假设代码的一部分使用organization.Employees.Add。代码的不同部分引用了dbContext.Employees。然后dbContext.Employees还不会包含new_guy,因为这两个集合没有神奇地相互同步。
当不同的团队成员使用(A)或(B)时,这可能是非常有问题的。
这里的最佳做法是什么?我们应该始终访问DbSet并且从不使用导航属性吗?我们应该编写一个自定义包装器吗?
答案 0 :(得分:0)
如果我理解得很清楚,那么您的问题可能就是DbContext
的生命周期。如果您使用的是DI Framework,则通常会根据请求配置此对象的生命周期。
使用Castle Windsor,这将是这样的:
container.Register(
Component.For<DbContext>()
.ImplementedBy<MyDbContext>()
.LifestylePerWebRequest());