gpt4 book ai didi

.net - Entity Framework 4.1 Code First 中的多个事件结果集

转载 作者:行者123 更新时间:2023-12-02 07:21:05 26 4
gpt4 key购买 nike

这是我的第一个 EF 项目,请耐心等待。

更新实体(例如部门)时,您可以从上下文中提取它,更新其值并调用 context.SaveChanges。但是,如果您更新 Department.Employees,EF 不会觉得这很有趣。

我搜索并找到了在连接字符串中设置 Multipleactiveresultsets=true 的选项,但想知道是否:

  • 这是推荐的方式吗?
  • 这会对性能产生不利影响吗/我应该注意什么?

最佳答案

仅当您想在同一连接上并行执行多个查询时才需要启用 MARS。如果您执行以下操作,就会发生这种情况:

/* Foreach uses an iterator over the resultset of your query, but the query is not fetched
immediately, instead the iterator internally triggers fetching for single
processed record from opened data reader. Because of that the query and the reader
are active until the iteration is over. */
foreach (var department in context.Departments.Where(...))
{
/* The first query is still active on the connection but now you are executing
lazy loading of all related employees =>. You are executing a second query and,
without MARS, you will get an exception. */
var employee = department.Employees.FirstOrDefault(...);
}

如何避免这种情况?

  • 使用预先加载而不是延迟加载:context.Departments.Include(d => d.Employees)
  • 在使用延迟加载之前具体化整个部门的结果集。这意味着不能访问循环内的员工。
  • 启用 MARS,上述示例即可正常工作

Is this the recommended way? Does this adversely affect performance / what should I look out for?

这取决于您要解决的问题。如果您有多个部门要处理,访问其员工集合将触发每个部门的单独查询。这称为 N+1 问题 - 您有 N 个部门和一个查询来获取它们,对于每个部门,您将执行一个附加查询 => N+1 个查询。对于很多部门来说,这将是性能 killer 。

预加载也不是万无一失的解决方案。它可以affect performance as well 。有时,您只需要执行单独的查询来获取所有必要的部门,并执行单独的查询来获取所有必要的员工。如果您关闭了延迟加载,它应该会修复您的关系并为您正确填充员工属性。顺便说一句,我做了一个suggestion on Data UserVoice开箱即用地支持此功能。

关于.net - Entity Framework 4.1 Code First 中的多个事件结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10478693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com