2013-08-21 6 views
2

В моем приложении я создаю userControl, а затем мне нужно сохранить его в базе данных. Вот мой метод, когда я сохраняю свой userControl:Сохранение базы данных занимает слишком много времени

private void SaveControl(byte userControlType, ISelectableViewModel viewModel, Guid guid) 
{ 
    var context = new EntitiesNew(); 

    var instrumentSettings = new INSTRUMENTSETTINGS 
           { 
            USERCONTROL = userControlType, 
            INSTRUMENTHEIGHT = (float)viewModel.InstrumentHeight, 
            INSTRUMENTWIDTH = (float)viewModel.InstrumentWidth, 
            INSTRUMENTSCALABLEVALUE = viewModel.ScalableValue, 
            INSTRUMENTPOSTOLEFT = (float)viewModel.InstrumentPosToLeft, 
            INSTRUMENTPOSTOTOP = (float)viewModel.InstrumentPosToTop, 
            INSTRUMENTZINDEX = viewModel.ZIndex, 
            CREATED_BY= guid 
           }; 

    context.INSTRUMENTSETTINGSs.Add(instrumentSettings); 
    context.SaveChanges(); 

    viewModel.ControlId = instrumentSettings.INSTRUMENTSETTINGSID; 

    var roomId = (from room in context.ROOMs 
       where room.ROOMNAME == viewModel.RoomName 
       select room.ROOMID).FirstOrDefault(); 

    var roomWithInstrument = new ROOMWITHINSTRUMENT 
         { 
          CREATED_BY = guid, 
          INSTRUMENTSETTINGSID = viewModel.ControlId, 
          ROOMID = roomId 
         }; 

    context.ROOMWITHINSTRUMENTs.Add(roomWithInstrument); 
    context.SaveChanges(); 
} 

Ошибок нет, и он работает. Единственная проблема заключается в том, что когда я сохраняю запись в базу данных впервые, она занимает слишком много времени (например, 2 секунды). После первого сохранения он работает лучше (меньше секунды). Поэтому мой вопрос: как я могу улучшить первую экономию, поэтому она будет экономить быстрее?

+0

Вы подключаетесь к базе данных каждый раз или один раз? Какой поставщик баз данных вы используете? – iabbott

+0

Очевидно, что это не самое лучшее предложение, пока приложение загружается, напишите незначительные изменения в базе данных :) –

+0

Имеет ли первый запрос базы данных 2 секунды? –

ответ

3

Прежде всего, вы должны положить свой контекст в using блоке

private void SaveControl(byte userControlType, ISelectableViewModel viewModel, Guid guid) 
{ 
    using(var context = new EntitiesNew()) 
    { 
     var instrumentSettings = //... 

     //... 

     context.SaveChanges(); 
    } 
} 

Если вы не делаете, что вы не отпуская соединения обратно в пул соединений, когда вы сделали, и это может привести к проблемы производительности для вас по мере запуска вашей программы.

К вашей реальной проблеме: Entity Framework делает много дополнительного «материала» в первый раз на AppDomain, который он подключается к базе данных. Вы видите, что это первый запрос, который вы вызываете, но вы можете сделать это раньше.

public static void InitializeDatabaseConnection() 
{ 
    using(var context = new EntitiesNew()) 
    { 
     context.Database.Initialize(false); 
    } 
} 

Этот метод инициализирует соединение для текущего AppDomain и позволит первому запросу быстрее. Я просто запускаю этот метод внутри задачи в начале вашей программы.

public static void Main(string[] args) 
{ 
    //Assumes you put the function inside the EntitiesNew class 
    Task.Run(() => EntitiesNew.InitializeDatabaseConnection()); 

    Application.Run(new Form1()); 
} 
Смежные вопросы