Обновить список <Entity>в EF4 - PullRequest
       16

Обновить список <Entity>в EF4

1 голос
/ 23 февраля 2012

Я пытаюсь обновить список содержимого с помощью EF4. Однако я не нашел способ сделать это. Мой текущий код выглядит следующим образом:

db.NotifContents.MergeOption = MergeOption.NoTracking;
List<NotifContent> notifContentList = db.NotifContents
     .Where(u => u.FKID_Contact == contactId && !u.Sent && u.CanSendMail)
     .ToList();

List<NotifContent> newNotifContentList = new List<NotifContent>();

foreach(NotifContent notifContent in notifContentList)
{
    notifContent.NextMailSend = dtNextMailSend;        newNotifContentList.Add(notifContent);
    try
    {
        //db.CreateObjectSet<NotifContent>().Attach(notifContent);
        //db.ObjectStateManager.ChangeObjectState(notifContent, System.Data.EntityState.Modified);

        db.AddToNotifContents(notifContent);
        ObjectStateEntry notifContentsEntry = db.ObjectStateManager
            .GetObjectStateEntry(notifContent);
        notifContentsEntry.ChangeState(EntityState.Modified);

        db.SaveChanges();

    }
    catch (Exception exc)
    {
    }
}

Однако второе обновление всегда будет неудачным, и понятно, что сущность присоединена к текстовому тексту данных.

Как мне сделать массовое обновление в EF4?

UPDATE

Измените цикл следующим образом

            foreach(NotifContent notifContent in notifContentList)
        {
            notifContent.NextMailSend = dtNextMailSend;
            db.NotifContents.Attach(notifContent);
            db.ObjectStateManager.ChangeObjectState(notifContent, EntityState.Modified);
        }

        db.SaveChanges();

и я получаю следующую ошибку: -

Объект с таким же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.

1 Ответ

1 голос
/ 23 февраля 2012

Я скачал библиотеку EntityFramework.Extended и существует метод .Update для массовых обновлений

Итак, я восстановил следующее: -

            var notifContents =
            db.NotifContents.Where(u => u.FKID_Contact == contactId && u.Sent == false && u.CanSendMail);
        db.NotifContents.Update(notifContents, u => new NotifContent{NextMailSend = dtNextMailSend});
...