EF最佳实践:使用导航集合与DBSet

时间:2015-07-17 10:38:54

标签: c# entity-framework convention

考虑这个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并且从不使用导航属性吗?我们应该编写一个自定义包装器吗?

1 个答案:

答案 0 :(得分:0)

如果我理解得很清楚,那么您的问题可能就是DbContext的生命周期。如果您使用的是DI Framework,则通常会根据请求配置此对象的生命周期。

使用Castle Windsor,这将是这样的:

container.Register(
         Component.For<DbContext>()
        .ImplementedBy<MyDbContext>()
        .LifestylePerWebRequest());