Используя Платформу Объекта в.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, и это - решение.
Не попробовали это, я уверен, что это будет работать, но даже это работает, я хочу знать, почему я не могу обновить объект во время цикла? Это происходит на моей локальной среде разработки без других пользователей, поражающих базу данных.
Спасибо...
Я бы согласился сделать 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();
Спасибо за рекомендацию по SavingChanges после цикла, я не подумал об этом. Однако мне нужно обработать более 1 миллиона записей, это не так уж и много, но есть некоторая обработка, которая будет выполняться во время каждого цикла. Поэтому я немного обеспокоен тем, что потребуется довольно много времени, чтобы зациклить 1 миллион записей, обновляющих информацию, а затем потребуется время, чтобы опубликовать изменения.
Я также знаю, что EntityFramework, вероятно, не лучший подход, но мне интересно изучить возможности и ограничения Entity Framework.
Также просто отметим, что список переменных фактически возвращает ObjectQuery типа Customer. Таким образом, цикл foreach может быть фактически записан, как указано выше, с использованием типа данных переменной Customer даже без преобразования в список.
И снова мой вопрос, который я хотел бы знать: почему я не могу опубликовать изменение в том же объекте контекста (DBEntities) во время цикла?