实体框架:SaveChanges()的一种工作方式,另一种方式则不然。为什么?

时间:2018-02-23 11:31:56

标签: c# entity-framework entity-framework-6

如果我这样做,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();
}

为什么?

1 个答案:

答案 0 :(得分:3)

实体框架所做的更改跟踪由DbContext本身完成。 MessageMethods.GetChangedMessages方法使用的是与调用它的方法不同的DbContext,因此无法正确跟踪更改。您可以将上下文传递给GetChangedMessages方法,也可以根据需要将实体附加到上下文中:

invalidMessages.ForEach(m => 
{
    m.Status = 11;
    context.Messages.Attach(m);
});
相关问题