SQL Server CE上的实体框架 - 懒惰与急切加载,性能注意事项

时间:2017-01-07 10:45:53

标签: sql-server entity-framework sql-server-ce

我有一个使用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运行时,这两种情况(渴望与延迟加载)会提供相同的性能。

1 个答案:

答案 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