我有一个使用Entity Framework构建的应用程序。实体具有virtual
导航属性,这意味着延迟加载。一切正常,但是,我注意到了性能问题。
某些属性的延迟加载会导致对数据库进行多次查询。例如如果我在10个项目的集合上.Where(...)
- 它将生成10个额外的数据库调用。让我们说这10个电话的SQL time
总共是20毫秒。但是完成查询所需的总时间要高得多。
如果我急切加载.Include(...)
,我会看到类似的SQL time
(即20毫秒),但操作完成得更快。
我还没有运行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运行时,这两种情况(渴望与延迟加载)会提供相同的性能。
答案 0 :(得分:1)
在应用程序启动代码中打开与数据库的连接,并在应用程序的生命周期内保持打开状态。不要将此连接用于任何数据访问。 这将打开SQL Compact文件并在启动时加载SQL Compact dll文件(并且仅在启动时)。
目前还不清楚您的应用程序是Web应用程序还是桌面应用程序,但您可以使用与此类似的代码并从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