实体框架4:添加派生实体在保存之前不会显示在计数中

时间:2011-04-19 11:13:08

标签: entity-framework inheritance entity-framework-4

我有一个“投资”实体,派生自“BaseEntity”。 如果我像这样创建并添加一个新的“投资”:

investment = new Investment();
investment.Name = "Investment 01";
_context.BaseEntities.AddObject(entity);

并查询计数(保存更改前)

_context.BaseEntities.OfType<Investment>().Count();

它返回零。在_context.SaveChanges();

之后,同一行返回1

我做错了什么?

3 个答案:

答案 0 :(得分:2)

你没有做错任何事。这就是EF的工作原理。在您执行SaveChanges之前,不会对数据库进行任何更改 - 它被称为工作单元。您准备内存中的所有更改,然后在一次交易中将它们全部保存在一起。

答案 1 :(得分:0)

仍然处于插入状态的实体将不会包含在查询结果中,因为该对象尚未与SaveChanges()

保持一致

执行_context.BaseEntities.OfType<Investment>().Count();方法将向SQL服务器发出请求并返回在数据库中找到的结果。

使用GetObjectByKey方法时,如果在ObjectContext上找到了先前加载的实体,则从上下文实例中获取实体的方法也会以相同的方式作出反应。由于对象处于新/插入状态,因此上下文会将其视为不存在,直到保存。

编辑:

在问题的代码中,您正在使用_context并在您提及的评论中 _container.BaseEntities.Count()

这两个对象有什么区别?

答案 2 :(得分:0)

这是正确的行为,因为对象位于状态管理器中,直到您调用SaveChanges()。只有在您调用SaveChanges()后,该对象才会在您的计数中可用。