.NET EntityFramework: “Ошибка произошла при запуске транзакции на соединении поставщика. Посмотрите внутреннее исключение для деталей”

Используя Платформу Объекта в.NET я хочу циклично выполниться через список объектов, возвращенных из базы данных и сделать обновления.

var qry = (from c in DBEntities.Customer select c);
foreach (Object item in qry)
{
  item.FirstName = .... 
  ... etc, other code here
  DBEntities.SaveChanges();
}

Согласно: http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/8a337036-d288-48d4-80d4-89e5a51eddd9?ppud=4 S Hargroves предлагает преобразовать в IList, и это - решение.

Не попробовали это, я уверен, что это будет работать, но даже это работает, я хочу знать, почему я не могу обновить объект во время цикла? Это происходит на моей локальной среде разработки без других пользователей, поражающих базу данных.

Спасибо...

8
задан Jon Seigel 6 April 2010 в 22:14
поделиться

2 ответа

Я бы согласился сделать var списком. Затем в вашем foreach вместо использования объекта Object в qry используйте Customer customer в qry. В этом сценарии вы действительно работаете с объектами клиентов, а не только с объектами. В большинстве случаев вы не захотите вызывать SaveChanges () в foreach, потому что он будет выполнять команду обновления на сервере каждый раз, когда выполняется. Если вы сделаете это после foreach, он сделает один пакет обращений к базе данных и будет работать намного лучше.

Предлагаемый мной псевдокод выглядит примерно так:

var customers = (from c in DBEntities.Customer select c).ToList<Customer>();
foreach (Customer customer item in customers)
{
  customer.FirstName = .... 
  ... etc, other code here

}
DBEntities.SaveChanges();
3
ответ дан 5 December 2019 в 10:02
поделиться

Спасибо за рекомендацию по SavingChanges после цикла, я не подумал об этом. Однако мне нужно обработать более 1 миллиона записей, это не так уж и много, но есть некоторая обработка, которая будет выполняться во время каждого цикла. Поэтому я немного обеспокоен тем, что потребуется довольно много времени, чтобы зациклить 1 миллион записей, обновляющих информацию, а затем потребуется время, чтобы опубликовать изменения.

Я также знаю, что EntityFramework, вероятно, не лучший подход, но мне интересно изучить возможности и ограничения Entity Framework.

Также просто отметим, что список переменных фактически возвращает ObjectQuery типа Customer. Таким образом, цикл foreach может быть фактически записан, как указано выше, с использованием типа данных переменной Customer даже без преобразования в список.

И снова мой вопрос, который я хотел бы знать: почему я не могу опубликовать изменение в том же объекте контекста (DBEntities) во время цикла?

0
ответ дан 5 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: