寻找实体框架上下文

通过各种各样的问题我在这里问和其他论坛,我来,我不知道我在做什么,当涉及到实体框架生成的实体上下文对象的结论。

作为背景,我有使用LLBLGEN临一吨的经验,实体框架是三周左右的老给我。

可以说我有一个名为“myContext”上下文。 有一个表/实体叫我的模范员工,所以我现在有一个myContext.Employees。 我认为这意味着该属性代​​表我的上下文中的一组员工的实体。 不过,我想错了,因为我可以添加一个新的实体与环境:

myContext.Employees.AddObject(new Employee());

而这个新员工的实体无处出现在 myContext.Employees。 从我收集,只有这样,才能找到这个新添加的实体是追查躲在myContext.ObjectStateManager。 这听起来好像设置myContext.Employees其实不是一组员工实体的背景下,而是某种存在于数据库中的雇员实体表示。

为了进一步增加这种混乱,比方说我在看一个员工实体。 有一个项目的实体,有一个M:有员工1的关系(员工可以有多个项目)。 如果我想一个新的项目添加到特定雇员,我只是做:

myEmployee.Projects.Add(new Project());

太好了,这实际上增加了项目的收集,因为我期望的那样。 但这种蝇正好在对象集属性如何关闭上下文工作的面貌。 如果我添加一个新的项目与环境:

myContext.Projects.AddObject(new Project());

这并没有改变设置的项目。

我会非常感激如果有人给我讲解一下。 另外,我真的想在环境中的所有雇员(或项目)的集合,我希望它可以作为上下文的属性。 与EF这可能吗?

--------------解决方案-------------

一个ObjectSet是一个查询。 就像一切都在LINQ,这是懒惰的。 它什么也不做,直到您列举,或致电像一个方法.Count()此时数据库查询运行,和任何返回的实体合并与那些已经在上下文中。

所以,你可以这样做:

var activeEmployees = Context.Employees.Where(e => e.IsActive)

......不运行的查询。

您可以进一步构成如下:

var orderedEmployees = activeEmployees.OrderBy(e => e.Name);

...再次,不运行查询。

但是,如果你进入设置:

var first = orderedEmployees.First();

......然后一个数据库查询运行。 这是所有LINQ。

如果要在上下文中已经列举的实体,你需要把目光投向ObjectStateManager代替。 因此,对于员工,你可以这样做:

var states = EntityState.Added || EntityState.Deleted || // whatever you need
var emps = Context.ObjectStateManager.GetObjectStateEntries(states)
.Select(e => e.Entity)
.OfType<Employee>();

需要注意的是,虽然这个工程,它不是我会建议工作的方式。 通常情况下,你不希望你的ObjectContexts是长期存在的。 对于这一点,和其他原因,他们不是真正适合作为对象的通用集装箱。 使用该平时的列表类型。 这是更准确的去思考一个ObjectContext的作为一个工作单元。 通常情况下,在一个工作单元你已经知道你正在使用哪些实例。

分类:实体框架 时间:2015-03-15 人气:0
本文关键词: 实体框架,实体框架4
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.404 (s). 10 q(s)