2017-01-07 5 views
0

У меня есть приложение, которое построено с помощью Entity Framework. Объекты имеют свойства навигации virtual, что означает ленивую загрузку. Однако все работает, но я заметил проблему с производительностью.Entity Framework на SQL Server CE - ленивая, с нетерпением загрузки, соображения производительности

Ленивая загрузка некоторых свойств вызывает несколько запросов к базе данных. например если я .Where(...) на коллекции из 10 элементов - он будет генерировать 10 дополнительных вызовов в базу данных. Предположим, что SQL time на этих 10 вызовах составляет в общей сложности 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

Откройте соединение с базой данных в вашем стартовом коде приложения и оставьте ее открытой на всю жизнь вашего приложения. Не используйте это соединение для доступа к данным. Это откроет файл SQL Compact и загрузит файлы dll SQL Compact при запуске (и только при запуске).

Неясно, если ваше приложение является веб-приложение или настольное приложение, но вы можете использовать код, подобный этому, и вызвать его из 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

+0

Спасибо за ваш ответ, это приложение для рабочего стола WPF. –

+0

Тот же код применяется, просто назовите его из App_Startup в WPF – ErikEJ