C# 实体框架:SaveChanges()的一种方式有效,另一种方式无效。为什么?

C# 实体框架:SaveChanges()的一种方式有效,另一种方式无效。为什么?,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,如果我这样做,context.SaveChanges()可以正常工作: List<Messages> DbChangedMessages = context.Messages .Where(m => m.Status == 0) .OrderBy(m => m.insertdate) .Take(maxNumberOfMessages)

如果我这样做,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();
}
List DbChangedMessages=context.Messages
.其中(m=>m.状态==0)
.OrderBy(m=>m.insertdate)
.Take(maxNumberOfMessages)
.ToList();
//查找指向无效模板的消息
列出invalidMessages=(来自DbChangedMessages中的m)
在上下文中连接t。m.templateId上的模板等于t.id
其中m.Status==0&&t.invalid==true
选择m)
.ToList();
如果(invalidMessages.Count>0)
{
//为状态为0的所有邮件设置状态为11,并指向无效模板
invalidMessages.ForEach(m=>m.Status=11);
SaveChanges();
}
新状态11被写入数据库。 但是,如果我将第一个查询移动到一个静态函数,返回这样的列表,SaveChanges()将不起作用(其余的保持不变)

List DbChangedMessages=MessageMethods.GetChangedMessages(maxNumberOfMessages);
//查找指向无效模板的消息
列出invalidMessages=(来自DbChangedMessages中的m)
在上下文中连接t。m.templateId上的模板等于t.id
其中m.Status==0&&t.invalid==true
选择m)
.ToList();
如果(invalidMessages.Count>0)
{
//为状态为0的所有邮件设置状态为11,并指向无效模板
invalidMessages.ForEach(m=>m.Status=11);
SaveChanges();
}

为什么?

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

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

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

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

您没有将上下文传递给静态方法。。。它如何知道如何使用您的上下文?请发一个帖子,我们基本上是在猜测。为什么是静态的?可能在静态方法中,上下文不同于调用SaveC改的上下文,考虑到它没有作为NVIGT描述的参数传递,您需要确保这些实体在正确的状态下被吸引并连接到正确的/相同的上下文。请重新考虑您的架构,征求您的意见。我在同一个db中有两个不同的dbcontext实例,一个在调用方法中,另一个在静态类中。我删除了静态类中的一个,并将外部dbcontext传递给MessageMethods.GetChangedMessages(),现在它可以工作(=db Get updated)。您不会将上下文传递给静态方法。。。它如何知道如何使用您的上下文?请发一个帖子,我们基本上是在猜测。为什么是静态的?可能在静态方法中,上下文不同于调用SaveC改的上下文,考虑到它没有作为NVIGT描述的参数传递,您需要确保这些实体在正确的状态下被吸引并连接到正确的/相同的上下文。请重新考虑您的架构,征求您的意见。我在同一个db中有两个不同的dbcontext实例,一个在调用方法中,另一个在静态类中。我删除了静态类中的一个,并将外部dbcontext传递给MessageMethods.GetChangedMessages(),现在它可以工作了(=db得到更新)。