Получил! Основной проблемой был весь холодный запрос. Как обойти эту проблему с холодным запросом? Сделав запрос. Это будет «разогревать» EntityFramework, чтобы последующая компиляция запросов была намного быстрее. Мои предварительно созданные представления ничего не помогли с запросом, который я компилировал в этом вопросе, но они, похоже, работают, если я хочу сбросить всю таблицу в массив (что плохо). Поскольку я использую WCF, который является без гражданства, мне придется «разогревать» EF для каждого звонка? Неа! Поскольку EF живет в домене приложения, а не в контексте, мне просто нужно разогреться при инициализации службы. Для dev целей я сам принимаю, но в производстве он живет в IIS.
Чтобы сделать запрос разогретым, я сделал поведение службы, которое позаботится об этом для меня. Создайте свой класс поведения как таковой:
using System;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels; // for those without resharper, here are the "usings"
using System.ServiceModel.Description;
public class InitializationBehavior : Attribute, IServiceBehavior
{
public InitializationBehavior()
{
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection endpoints,
BindingParameterCollection bindingParameters)
{
Bootstrapper.WarmUpEF();
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
Затем я использовал это для разминки:
public static class Bootstrapper
{
public static int initialized = 0;
public static void WarmUpEF()
{
using (var context = new ReportingDbContext())
{
context.Database.Initialize(false);
}
initialized = 9999; // I'll explain this
}
}
Этот вопрос SO помог с кодом разминки: Как сделать Я инициализирую свои запросы Entity Framework, чтобы ускорить их работу.
Затем вы удаляете это поведение в своей службе WCF следующим образом:
[InitializationBehavior]
public class InventoryService : IInventoryService
{
// implement your service
}
Я запустил проект своих служб в режим отладки, который, в свою очередь, активировал поведение инициализации. После спама метода, который делает запрос, на который делается ссылка в моем вопросе, моя точка останова в поведении не была удалена (кроме удара, когда я впервые ее разместил). Я проверил, что это было, проверив статическую инициализированную переменную. Затем я опубликовал этого плохого мальчика в IIS с моей проверкой int, и у него было такое же поведение.
Итак, короче говоря, если вы используете Entity Framework 5 с сервисом WCF и не хотите дрянной первый запрос, разогрейте его с помощью поведения службы. Есть, вероятно, другие / лучшие способы сделать это, но этот способ тоже работает!
edit: Если вы используете NUnit и хотите размять EF для своих модульных тестов, настройте свой тест как таковой:
[TestFixture]
public class InventoryTests
{
[SetUp]
public void Init()
{
// warm up EF.
using (var context = new ReportingDbContext())
{
context.Database.Initialize(false);
}
// init other stuff
}
// tests go here
}