【问题标题】:Entity Framework 4: Adding dervied entity won't show in count until save实体框架 4:添加派生实体在保存之前不会显示在计数中
【发布时间】:2011-04-19 11:13:08
【问题描述】:

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

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

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

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

它返回零。 _context.SaveChanges(); 后同一行返回 1;

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我现在知道了。但我的理解是,DataContext 应该给我正确的计数,因为它在内存中有新添加的对象。如果我这样做:_container.BaseEntities.Count() 我得到正确的数字。
    • 我想要一个“投资”的 ObjectSet 而不是“ObjectQuery”。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      仍处于插入状态的实体将不会包含在查询结果中,因为该对象尚未使用 SaveChanges() 进行持久化

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

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

      编辑:

      在您使用 _context 的问题的代码和您提到的评论中 _container.BaseEntities.Count()

      这两个对象有什么区别?

      【讨论】:

      • 那么为什么我不能得到一个“投资”的对象集呢?我实际上不想使用 ObjectQuery。
      • 为什么不使用内存列表然后提交到上下文?
      • 有可能做到这一点......但是为什么要打扰。我不明白为什么 EF 必须处理不同的派生实体。
      猜你喜欢
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多