代码之家  ›  专栏  ›  技术社区  ›  Oliver Kötter

实体框架:SaveChanges()一种方式工作,另一种方式不工作。为什么?[已关闭]

  •  0
  • Oliver Kötter  · 技术社区  · 8 年前

    如果我这样做,上下文。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写入数据库。 但是,如果我将第一个查询移动到一个静态函数,返回这样的列表,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 回复  |  直到 8 年前
        1
  •  3
  •   MarkFl    8 年前

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

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