【问题标题】:What is happening behind EF SaveChanges()EF SaveChanges() 背后发生了什么
【发布时间】:2013-04-10 12:46:13
【问题描述】:

假设我有一个与其他几个实体关联的域对象(当然映射到多个表)。我对主实体和关联实体进行了更改。自然,EF 必须在保存时在多个表中更新它。

无论是 ObjectContext 还是 DbContext,调用 SaveChanges() 方法都会告诉 Entity Framework “将在此上下文中所做的所有更改保存到底层数据库。”

谁能告诉我“SaveChanges() 背后发生了什么”?

所有生成的 sql 语句 INSERT/UPDATE/DELETE 是否作为准备好的语句一次性进入数据库?

还是EF和DB来回做sql语句一个一个的执行?

EF中是否有任何配置可以在这之间切换?

【问题讨论】:

  • 你可以分析你的数据库,看看到底发生了什么
  • 您可以使用Miniprofiler查看EF查询。
  • Kieren,当您学习/理解幕后发生的事情时,您可以编写高效的代码。例如,如果有一些选项,我会切换到准备好的语句模式,以在处理大量事务更新时提高性能。
  • 如果你想真正了解幕后发生的事情,我建议你使用 .NET 反编译器来查看 System.Data.Entity 程序集。
  • @TMcManemy EF6 在entityframework.codeplex.com 是开源的,因此无需反编译。只需克隆在 VS 中打开的 repo 并浏览、调试等。SaveChanges() 与 EF5 相比没有太大变化

标签: c# .net entity-framework entity-framework-4 ado.net


【解决方案1】:

目前 CUD 操作的语句没有批处理。我们有一个work item 来解决这个问题。欢迎点赞

【讨论】:

    【解决方案2】:

    据我了解,每个修改的 entity 都会导致到数据库的往返(全部由单个事务绑定)。虽然我不知道有任何配置会改变这种行为,但我不会说没有实现这种“批处理”功能的 EF 实现。我只是认为它们不可用,开箱即用。

    【讨论】:

    • 当您处理一系列更改时,性能明显受到影响。为什么 EF 团队选择往返而不是准备好的 sql 语句?
    猜你喜欢
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2016-06-28
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2019-08-23
    相关资源
    最近更新 更多