Entity Framework 在 SQL 服务器 CE - 延迟加载与急切加载,性能考虑

Entity Framework on SQL Server CE - lazy vs eager loading, performance considerations

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

某些属性的延迟加载导致对数据库的多次查询。例如如果我 .Where(...) 处理 10 个项目的集合 - 它将生成对数据库的 10 个额外调用。假设这 10 次调用的 SQL time 总共为 20 毫秒。但完成查询所需的总时间要长得多。

如果我使用 .Include(...) 预加载,我会看到类似的 SQL time(即 20 毫秒),但操作完成得更快。

我还没有 运行 Profiler,但我怀疑瓶颈是打开和关闭 SQL 服务器 CE 数据库,或其他一些类似的 'infrastructure' 操作。

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

我现在的连接字符串

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

我真的已经将问题缩小到 SQL CE,因为当 运行 针对 SQL 服务器时,两种情况(急切加载与延迟加载)提供相同的性能。

在您的应用程序启动代码中打开一个到数据库的连接,并在您的应用程序的生命周期内保持打开状态。不要使用此连接进行任何数据访问。 这将打开 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();
    }
  }
}

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