【问题标题】:Entity Framework Code First - Reducing round trips with .Load() and .Local实体框架代码优先 - 使用 .Load() 和 .Local 减少往返行程
【发布时间】:2011-03-30 15:39:02
【问题描述】:

我正在使用 Entity Framework Code Fist 设置一个新应用程序,并且正在寻找方法来尝试尽可能减少到 SQL Server 的往返次数。

当我第一次阅读 .Local 属性 here 时,我对在处理管道的早期关闭整个对象图然后在以后使用 .Local 的可能性感到兴奋,而不必担心会产生额外回合的成本旅行。

现在我正在玩它,我想知道是否有任何方法可以在一次往返中删除单个请求所需的所有数据。例如,如果我有一个网页,上面有一些列表、新闻、事件和讨论。有没有一种方法可以在一次往返中将他们 3 个不相关的源表的记录记录到 DbContext 中?互联网上的所有人都认为单个页面与数据库服务器进行 20 次往返是完全没问题的吗?我想通过适当的缓存机制可以缓解这个问题。

在一次往返中从 EF 查询返回多个结果时,我确实遇到了 couplecracks,但我不确定这些解决方案的复杂性和成熟度是否值得。

一般而言,在组合要传递给 MVC 控制器的数据集方面,您是否认为最好对您需要的每组记录进行单独的查询,然后使用以下任一方法担心缓存层的大部分性能EF Caching Provider 或 asp.net 缓存?

【问题讨论】:

标签: entity-framework entity-framework-4.1


【解决方案1】:

如果需要,可以进行多次 DB 调用。如果您害怕多次往返,您可以编写存储过程并返回多个结果集(不适用于默认 EF 功能)或异步执行查询(同时运行多个分离查询)。无法使用单个 linq 查询加载 unrealted 数据。

还有一个通知。如果您决定使用异步方法,请确保在每个异步执行中使用单独的上下文实例。异步执行使用单独的线程,上下文不是线程安全的。

【讨论】:

  • Loading unrealted data with single linq query is not possible. EF 6 在 2014 年仍然不可能吗?
  • @zespri:自 EF 5 起支持映射具有多个结果集的存储过程。
【解决方案2】:

如果您还没有性能问题,我认为您做了很多工作却收效甚微。是的,注意你在做什么,不要打不必要的电话。每个查询的实际连接和跨线开销通常非常低,所以不用担心。

记住“过早的优化是万恶之源”。

【讨论】:

  • 确实如此。我现在处于预生产阶段,想了解如何构建这些系统,似乎缓存是数据库调用优化的方法。
  • “……在 97% 的时间里。”
【解决方案3】:

我的经验法则是,为您要检索的每个集合对象执行调用是可以的。为要检索的每一行执行调用是不好的。如果您的网页需要 20 个集合,那么 20 个调用就可以了。

话虽如此,如果您使用 Translate 方法,将其减少为一次调用并不困难。像这样的代码会起作用

var reader = GetADataReader(sql);
var firstCollection = context.Translate<whatever1>(reader);
reader.NextResult();
var secondCollection = context.Translate<whateve2r>(reader);
etc

这样做的最大缺点是,如果您将 sql 放入存储过程中,那么您的存储过程将变得非常特定于您的网页,而不是更通用。只要您可以很好地访问数据库,这并不是世界末日。否则你可以在代码中定义你的 sql。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多