我有一个使用实体框架构建的应用程序。实体具有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