Как распечатать значения переменных, содержащихся в массиве, частично неиспользованном в cplex

Получил! Основной проблемой был весь холодный запрос. Как обойти эту проблему с холодным запросом? Сделав запрос. Это будет «разогревать» 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
}

0
задан Orane 26 February 2015 в 13:05
поделиться