如果我这样做,context.SaveChanges()工作正常:
List<Messages> DbChangedMessages = context.Messages
.Where(m => m.Status == 0)
.OrderBy(m => m.insertdate)
.Take(maxNumberOfMessages)
.ToList();
//look for messages that point to invalid template
List<Messages> invalidMessages = (from m in DbChangedMessages
join t in context.Templates on m.templateId equals t.id
where m.Status == 0 && t.invalid == true
select m)
.ToList();
if (invalidMessages.Count > 0)
{
//set Status=11 for all messages that have Status=0 and point to an invalid template
invalidMessages.ForEach(m => m.Status = 11);
context.SaveChanges();
}
新的状态11将写入数据库。 但是,如果我将第一个查询移动到返回List的静态函数,则SaveChanges()不起作用(其余部分保持不变)。
List<Messages> DbChangedMessages = MessageMethods.GetChangedMessages(maxNumberOfMessages);
//look for messages that point to invalid template
List<Messages> invalidMessages = (from m in DbChangedMessages
join t in context.Templates on m.templateId equals t.id
where m.Status == 0 && t.invalid == true
select m)
.ToList();
if (invalidMessages.Count > 0)
{
//set Status=11 for all messages that have Status=0 and point to an invalid template
invalidMessages.ForEach(m => m.Status = 11);
context.SaveChanges();
}
为什么?
答案 0 :(得分:3)
实体框架所做的更改跟踪由DbContext本身完成。 MessageMethods.GetChangedMessages方法使用的是与调用它的方法不同的DbContext,因此无法正确跟踪更改。您可以将上下文传递给GetChangedMessages方法,也可以根据需要将实体附加到上下文中:
invalidMessages.ForEach(m =>
{
m.Status = 11;
context.Messages.Attach(m);
});