entity-framework - 查找 Entity Framework 上下文

标签 entity-framework entity-framework-4

通过我在这里和其他论坛提出的各种问题,我得出的结论是,当涉及到 Entity Framework 中生成的实体上下文对象时,我不知道自己在做什么。

作为背景,我有大量使用 LLBLGen Pro 的经验,而 Entity Framework 对我来说大约是三周大。

假设我有一个名为“myContext”的上下文。在我的模型中有一个名为 Employee 的表/实体,所以我现在有一个 myContext.Employees。我认为这意味着此属性表示我的上下文中的 Employee 实体集。但是,我认为是错误的,因为我可以使用以下命令在上下文中添加一个新实体:

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

和这个新的员工实体 无处可见 在 myContext.Employees 中。据我所知,找到这个新添加的实体的唯一方法是追踪它隐藏在 myContext.ObjectStateManager 中。这听起来像 myContext.Employees 集实际上不是上下文中的 Employee 实体集,而是数据库中存在的 Employee 实体的某种表示。

为了进一步增加这种困惑,假设我正在查看一个 Employee 实体。有一个与员工有 M:1 关系的项目实体(一个员工可以有多个项目)。如果我想为特定员工添加一个新项目,我只需要:
myEmployee.Projects.Add(new Project());

太好了,这实际上将项目添加到集合中,正如我所期望的那样。但这与上下文中 ObjectSet 属性的工作方式背道而驰。如果我将一个新项目添加到上下文中:
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>();

请注意,虽然这有效,但我不建议这样做。通常,您不希望 ObjectContext 是长期存在的。由于这个原因和其他原因,它们并不真正适合作为对象的通用容器。为此使用通常的 List 类型。将 ObjectContext 视为一个工作单元更为准确。通常,在一个工作单元中,您已经知道正在使用哪些实例。

关于entity-framework - 查找 Entity Framework 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2716359/

相关文章:

.net - EF4 和代码优先方法

c# - 带有包含的 Linq 查询似乎不会在 EF 4.0 中返回正确的结果

c# - 使用自定义逻辑在 MVC 中对大量数据进行分页

c# - 防止 DbContext 反复尝试保存错误数据

c# - 如何修复 Entity Framework Core 错误 "Value cannot be null. Parameter name: frameworkName"?

c# - LINQ 到实体 : All method not yielding the expected result

linq - EF如何按日期过滤数据

c# - LINQ:无法将类型 'System.Int32' 转换为类型 'System.Object'

c# - 实体类型 'IdentityUserLogin<string>' 需要定义主键

asp.net-mvc-3 - EF 代码第一个 : How do I see 'EntityValidationErrors' property from the nuget package console?