2008-10-10 7 views
8

У кого-нибудь есть хорошая информация об использовании метода .SaveChanges()?Каков наилучший способ использования метода .SaveChanges() в службах данных ADO.Net?

У меня возникает множество проблем при попытке использовать метод .SaveChanges() для объекта контекста данных. Я беру данные из существующего источника данных, создавая соответствующие объекты EntityFramework/DataService, заполняя эти созданные объекты данными, добавляя эти объекты в контекст, а затем сохраняя эти данные, вызывая .SaveChanges.

Сценарии, с которыми я столкнулся (и связанные с ними проблемы), таковы ... В каждом сценарии у меня есть цикл foreach, который принимает данные из строк в DataTable и генерирует объекты, прикрепляя их к контексту по мере их поступления. (обратите внимание: три объекта - «член» и два «адреса», которые подключены через вызов SetLink) - в основном это инструмент преобразования, который позволяет получать данные из одного хранилища данных и массировать их в хранилище данных, которое предоставляется службами данных.

  • .SaveChanges вызова() без каких-либо параметров, как только в конце цикла Еогеаспа (т.е. вне цикла)
    • OutOfMemory ошибки около 1/3 пути (30000 из 90000 позволяет экономить) - не уверен, как это происходит, поскольку, поскольку каждый элемент сохранения является отдельным SQL-вызовом в базу данных, на чем заканчивается память?
  • .SaveChanges вызова() без каких-либо параметров один раз в цикле
    • Это работает, но занимает Absolutly навсегда (8 часов 90000) спасает
  • .SaveChanges вызовов (SaveChangesOption.Batch) один раз в конце цикла Еогеасп
    • же OutOfMemory ошибки, но без каких-либо сохраняет в базе данных
  • вызова .SaveChanges (SaveChangesOption.Batch) один раз в цикле
    • 404 не найдена ошибка
  • вызова .SaveChanges (SaveChangesOption.Batch) один раз в 10 петель
    • 400 Bad Request ошибки (время от времени)
    • OutOfMemory после ряда итераций
  • Несколько случайных попыток создать контекст один раз для каждого цикла или иметь его как переменную в начале цикла или использовать ее как переменную частного члена, которая доступна.
    • Отличающиеся результаты, не в состоянии количественно, ни на самом деле, что хорошее

Что является предпочтительным методом вызова .SaveChanges() из объекта клиента при выполнении большой загрузки данных, как это? Есть ли что-то, о чем я не понимаю, как работает .SaveChanges()? Может ли кто-нибудь предоставить более подробную информацию о том, как следует использовать эту функцию, и что (если таковые имеются) являются ограничениями для сохранения данных через службы данных?Существуют ли какие-либо рекомендации по вызову метода .SaveChanges()? Есть ли особенно хорошая документация по вызову метода .SaveChanges()?

+0

Какие «изменения» вы внедряете? Почему 90 000 экономит? Может быть, вы должны попробовать SQL-репликацию, если вы просто передаете данные? просто мысль. – D3vtr0n 2008-11-28 05:16:53

+0

просто для пояснения, когда вы говорите «один раз за цикл», вы имеете в виду один вызов за цикл * итерация *? – Veverke 2015-10-12 12:22:04

ответ

3

У меня нет большого опыта в использовании EntityFramework (только некоторый случайный эксперимент), вы пробовали призывающие .SaveChanges() каждые п итерации?

Я имею в виду что-то вроде этого:

int i = 0; 
foreach (var item in collection) 
{ 
    // do something with your data 
    if ((i++ % 10) == 0) 
     context.SaveChanges(); 
} 
context.SaveChanges(); 

Я знаю, что это некрасиво, но это первое из возможных решений я придумал.

0

Я использую EntityFramework в небольшом проекте, поэтому меня тоже интересует вопрос. Два быстрых вопроса: Вы пытались включить кеширование объектов данных в datacontext? Вы пытались закрыть datacontext и создали новый во время цикла, чтобы освободить память?

С уважением

Кеннет

+0

Создание нового контекста во время цикла освобождает память, которая действительно помогает, но затем делает сохранение более продолжительным (кажется, некоторые улучшения улучшены обработкой больших групп элементов). как один поворот кэширования объектов данных? – ChrisHDog 2008-12-02 05:22:10

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

  • Нет связанных вопросов^_^