我正在尝试使用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)
{
}
}
然而,第二次更新将始终失败,并且可以理解,因为实体已附加到datacontext。
如何在EF4中进行批量更新?
更新
按如下方式更改循环
foreach(NotifContent notifContent in notifContentList)
{
notifContent.NextMailSend = dtNextMailSend;
db.NotifContents.Attach(notifContent);
db.ObjectStateManager.ChangeObjectState(notifContent, EntityState.Modified);
}
db.SaveChanges();
我收到以下错误: -
ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。
答案 0 :(得分:1)
我已经下载了EntityFramework.Extended Library,并且有一个名为.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});