SQL Server CE上的实体框架-懒惰与急于加载、性能考虑



我有一个使用实体框架构建的应用程序。实体具有virtual导航属性,这意味着延迟加载。一切正常,但是,我注意到性能问题。

某些属性的延迟加载会导致对数据库进行多次查询。例如,如果我对10个项目的集合.Where(...),它将生成对数据库的10个额外调用。假设这10个呼叫上的SQL time总共是20ms。但是完成查询所需的总时间要高得多。

如果我急于加载.Include(...),我会看到类似的SQL time(即20ms),但操作完成得更快。

我还没有运行Profiler,但我怀疑瓶颈是打开和关闭SQL Server CE数据库,或其他类似的"基础结构"操作。

我真的很想使用懒惰加载,它让我的代码更简单。有没有什么方法可以优化SQL Server CE连接,或者我可以做些什么来提高SQL Server CE的性能?

我的连接字符串现在

<add name="dataRepositoryConnection" 
connectionString="Data Source=|DataDirectory|XXX.sdf"  
providerName="System.Data.SqlServerCe.4.0" />

我真的把问题缩小到了SQL CE,因为当在SQL Server上运行时,这两种场景(热切加载和懒惰加载)提供了相同的性能。

在应用程序启动代码中打开与数据库的连接,并在应用程序的整个生命周期内保持打开状态。请勿将此连接用于任何数据访问。这将在启动时(并且仅在启动时)打开SQL Compact文件并加载SQL Compact dll文件。

目前尚不清楚您的应用程序是网络应用程序还是桌面应用程序,但您可以使用类似的代码,并从application_Start/app_Startup等调用它:

public static class ContextHelper
{
private static ChinookEntities context ;
private static object objLock = new object();
public static void Open()
{
lock (objLock)
{
if (context != null)
throw new InvalidOperationException("Already opened");
context = new ChinookEntities();
context.Connection.Open();
}
}
}

请参阅我博客文章中的部署部分:http://erikej.blogspot.dk/2011/01/entity-framework-with-sql-server.html

最新更新