实体框架代码优先 - 使用.Load()和.Local减少往返

时间:2011-03-30 15:39:02

标签: entity-framework entity-framework-4.1

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

当我第一次阅读.Local属性here时,我很高兴有可能在我的处理管道中提前删除整个对象图,然后使用.Local,而不必担心会产生成本。额外的往返旅行。

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

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

一般而言,在组合要传递给MVC控制器的数据集方面,您认为最好只为每个需要的记录集创建一个单独的查询,然后在缓存层中使用其中一个来担心大部分性能{{3}}或asp.net缓存?

3 个答案:

答案 0 :(得分:3)

如果需要,可以进行多次DB调用。如果您害怕多次往返,您可以编写存储过程并返回多个结果集(不能使用默认的EF功能)或异步执行查询(同时运行多个析取查询)。使用单个linq查询加载未实现的数据是不可能的。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

话虽如此,如果您使用Translate方法,将此减少到一个调用并不困难。像这样的代码可以工作

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

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

相关问题