通过在这里和其他论坛上提出的各种问题,我得出结论,在使用Entity Framework中生成的实体上下文对象时,我完全不知道自己在做什么。
背景是,我有大量使用LLBLGen Pro的经验,而Entity Framework对我来说只有三周的时间。
假设我有一个名为“myContext”的上下文。我的模型中有一个名为Employee的表/实体,因此现在我有一个myContext.Employees。我认为这意味着该属性表示上下文中的Employee实体集。但是,我错了,因为我可以使用以下代码向上下文添加新实体:
myContext.Employees.AddObject(new Employee());
从我的理解来看,这个新的Employee实体在myContext.Employees中根本没有出现。我了解到,找到这个新添加的实体的唯一方法是在myContext.ObjectStateManager中追踪它。这对我来说听起来像是myContext.Employees集合实际上不是上下文中存在的Employee实体的集合,而是某种表示存在于数据库中的Employee实体的方式。
更进一步地,假设我正在查看一个单独的Employee实体。有一个Project实体,它与Employee具有M:1关系(一个员工可以拥有多个项目)。如果我想要给特定的员工添加一个新项目,我只需要执行:
myEmployee.Projects.Add(new Project());
太好了,这实际上按照我的期望将项目添加到了集合中。但是这与上下文的ObjectSet属性的工作方式完全不同。如果我使用以下方式向上下文添加新项目:
myContext.Projects.AddObject(new Project());
这不会改变项目集合。
如果有人能够解释一下,我将非常感激。此外,我真的想要一个包含上下文中所有员工(或项目)的集合,并且我希望它作为上下文的属性可用。在EF中是否可能实现?
ObjectContext
去做更改跟踪。但如果你需要一个活动员工列表,而且不想每次都查询数据库,尽管使用List
或类似的东西。只要意识到,如果列表超出上下文的生命周期,你必须先分离和附加才能在更新中使用实体,所以通常重新查询会更容易(而且足够快)。缓存策略很难得到正确的结果。 - Craig Stuntz