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

Есть ли у кого-нибудь полезная информация об использовании метода .SaveChanges ()?

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

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

  • Вызовите .SaveChanges () без параметров один раз в конце цикла foreach (т. Е. Вне цикла)
    • Ошибка OutOfMemory примерно на 1/3 пути (30 000 из 90 000 сохранений) - не уверен, как это происходит, хотя, поскольку каждый элемент сохранения представляет собой отдельный SQL-запрос к базе данных, для чего не хватает памяти?
  • Вызов .SaveChanges () без параметров один раз за цикл
    • Это работает, но абсолютно безвозвратно (8 часов на 90 000 сохранений)
  • Вызовите .SaveChanges (SaveChangesOption.Batch) один раз в конце цикла foreach.
    • Та же ошибка OutOfMemory, но без сохранения в базу данных
  • Вызов .SaveChanges (SaveChangesOption.Batch) один раз за цикл
    • 404 не найдена ошибка
  • Вызов .SaveChanges (SaveChangesOption.Batch) один раз в 10 циклов
    • 400 Ошибка неверного запроса (иногда)
    • OutOfMemory после нескольких итераций
  • Число случайных попыток создать контекст один раз за цикл, или иметь его в качестве переменной в начале цикла, или иметь доступную переменную-член.
    • Разные результаты, не в состоянии количественно оценить, ни один действительно не хороший

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

Ответы [ 2 ]

4 голосов
/ 11 декабря 2008

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

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

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

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

0 голосов
/ 04 ноября 2008

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

Привет

Кеннет

...