2012-04-18 4 views
3

Я использую BindingSource с Entity Framework, и когда я называюEntityContext.SaveChange() занимает больше времени при первом вызове

EntityContext.SaveChange(); 

это занимает больше времени, чтобы выполнить то в следующий раз добавить новые объекты источник привязки, а затем вызвать SaveChanges(); Метод

EDIT 2

Детали:

При виде нагрузки события

BindingSource.DataSource = EntityContext.Table; 

Добавить новую кнопку

BindingSource.AddNew(); 
Table m_object= (Table)BindingSource.Current; 
m_object.ID = Guid.NewGuid(); 

Другие данные объекта редактируется с помощью элементов управления переплетенных к его свойствам

А затем кнопку сохранить

BindingSource.EndEdit(); 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
EntityContext.SaveChanges(); 
sw.Stop(); 
Console.WriteLine(sw.Elapsed.ToString()); 

Если я повторил добавление и сохранение в несколько раз, я получаю следующий результат:

00: 00: 01.0788243

00: 00: 00.0316786

00: 00: 00,0292763

00: 00: 00,0298630

00: 00: 00,1127312

Примечательно, что первая надстройка и операция сохранения занимает почти одну секунду больше, чем в очередной раз я добавить и сохранить.

ответ

1

Это может быть по целому ряду причин, одна из возможных причин заключается в том, что ваша база данных является AutoGrowing, когда вы выполняете первый коммит. У вас есть пример кода, который вы выполняете, и разница во времена, которые вы наблюдаете

EDIT:

Основываясь на вашем коде выше вы создаете новый элемент, если он не существует в базе данных, может быть, во второй раз, когда вы нажимаете «Сохранить», вы просто выполняете операцию обновления, которая быстрее выполняется внутри SQL? (или потенциально 0 раз, если EF обнаруживает, что изменений не существует)

+0

Я добавил подробно к вопросу, и о различиях во времени вы имеете в виду, сколько времени между вызовом вызовов SaveChanges(), также что вы подразумеваете под ** AutoGrowing ** – major

+1

@major Это было бы хорошо, если бы вы могли количественно определить, что вы подразумеваете под «требуется больше времени для выполнения, а затем в следующий раз метод называется», сколько времени потребовалось, чтобы вызвать saveChanges в первый раз, и сколько времени потребовалось во второй раз? SQL autogrow - это функция, которая быстро расширяет вашу базу данных, чтобы вы могли поместить в нее больше вещей. Обычно это вызвано оператором insert. Взгляните сюда, чтобы узнать об автостраде http://www.simple-talk.com/sql/database-administration/sql-server-database-growth-and-autogrowth-settings/ –

+0

@major также взгляните на мое редактирование , вполне возможно, что во второй раз, когда вы нажимаете «Сохранить», на самом деле возникают какие-либо изменения для сохранения или более быстрый вызов обновления. –

0

Может ли причина, предоставленная Люком, а также не забывать о компиляции JIT (точно в момент времени). Когда вы запускаете свое приложение C#, оно все скомпилировано для MSIL (Microsoft Intermediate Language), и когда вы впервые вызываете методы, JIT должен скомпилировать их в собственный код и выполнить оптимизацию в соответствии с операционной системой, на которой он запущен. Это распространенная причина, по которой в первый раз, когда вы выполняете обширную операцию, могут быть секунды задержки, а не ожидаемые миллисекунды.

Моно обладает способностью собирать AOT (впереди), что означает, что он пропускает этот шаг и избегает этого дополнительного времени при первом вызове метода, но вы жертвуете результатами в другом месте.

Существует также инструмент, который позволяет предварительно скомпилировать C# на окнах, но я не помню, как он называется.

http://en.wikipedia.org/wiki/Just-in-time_compilation

0

Кроме того, не забывайте о EF отслеживания изменений, которые могли бы быть кэширование данных после первой операции. На основе MergeOption и операции, которую вы выполняете, EF может выбрать даже не звонить в базу данных. Я бы попробовал тест с SQL Profiler, чтобы увидеть разницу в фактических вызовах в базу данных. Кроме того, проверьте, используют ли последующие вызовы одно и то же соединение db.

Смежные вопросы