C# DbContext.SaveChanges()方法未提交到SQL Server数据库

C# DbContext.SaveChanges()方法未提交到SQL Server数据库,c#,asp.net-mvc,entity-framework,linq,C#,Asp.net Mvc,Entity Framework,Linq,这是我的代码,它是ASP.NET MVC控制器操作的一部分(通过单击按钮触发) 它不会抛出任何错误,但不会更新数据库中的记录 我试着用这句话: context.Entry(result).State = EntityState.Modified; 在foreach循环之前,但它抛出一个错误 实体类型DbQuery`1不是当前上下文的模型的一部分 我知道实际的代码行应该是这样的: DOWNLOAD_ORDER_HEADER doh; context.Entry(doh).State = Enti

这是我的代码,它是ASP.NET MVC控制器操作的一部分(通过单击按钮触发)

它不会抛出任何错误,但不会更新数据库中的记录

我试着用这句话:

context.Entry(result).State = EntityState.Modified;
在foreach循环之前,但它抛出一个错误

实体类型DbQuery`1不是当前上下文的模型的一部分

我知道实际的代码行应该是这样的:

DOWNLOAD_ORDER_HEADER doh;
context.Entry(doh).State = EntityState.Modified;

但我只需要为LINQ查询返回的行更新DOWNLOAD_ORDER_头表的一个字段。如何执行此操作?

您不需要更改context.Entry(item).State,如果您实际正在修改item.STATUS,如果item.STATUS已经等于“Assigned”,则实体框架显然不会进行更新,因为没有任何更改

对于测试,这是实体状态的正确更改,您需要设置循环结果中每个项目的状态:

var result = from b in context.DOWNLOAD_ORDER_HEADER.Where(b => csgList.Contains(b.PRO_NUM_ALPHA)) select b;
foreach (var item in result)
{
    item.STATUS = "Assigned";
    context.Entry(item).State = EntityState.Modified;
}
为什么Entity Framework不自动将每个下载\订单\标题实体的状态设置为“已修改”是奇怪的,如果item.STATUS不是“已分配”的,则是context.SaveChanges();在for循环之后,应该对数据库执行更新

同时,手动执行
context.Entry(item.State=EntityState.Modified将证明或不证明数据库正在更新


您是否将此代码包装在一个try-catch块中,并且实际抛出了一个异常,并且可能正在处理该异常?

您不需要更改context.Entry(item).State(如果您实际正在修改item.STATUS,如果item.STATUS已等于“Assigned”,显然,实体框架不会进行更新,因为并没有任何更改

对于测试,这是实体状态的正确更改,您需要设置循环结果中每个项目的状态:

var result = from b in context.DOWNLOAD_ORDER_HEADER.Where(b => csgList.Contains(b.PRO_NUM_ALPHA)) select b;
foreach (var item in result)
{
    item.STATUS = "Assigned";
    context.Entry(item).State = EntityState.Modified;
}
为什么Entity Framework不自动将每个下载\订单\标题实体的状态设置为“已修改”是奇怪的,如果item.STATUS不是“已分配”的,则是context.SaveChanges();在for循环之后,应该对数据库执行更新

同时,手动执行
context.Entry(item.State=EntityState.Modified将证明或不证明数据库正在更新


您是否将此代码包装在try-catch块中,并且实际抛出了一个异常,并且可能正在处理它?

请尝试下面的代码,希望这对您有所帮助

上下文。“您的数据库表”。AddObject(结果);
SaveChanges()

请尝试下面的代码,希望这对您有所帮助

上下文。“您的数据库表”。AddObject(结果);
SaveChanges()

context.Entry(item).State=EntityState.Modified也应该可以正常工作。您是否在
结果
中获得了预期的输出?您可以尝试在foreach行处/之前添加一个断点,以确保
结果
不为空。否则,我看不出更改是如何保存的。不需要将状态更改为“已修改”。分配新值已更改此值。调试帮助:通过检查分配后的状态,可以查看调试器中的状态。你确定你的结果不是空的吗?Use:Result.Any()。你确定你的任务是改变吗?在分配任务之前检查项目的值。你确定没有保存任何内容:检查SaveChanges()的返回值我检查了所有内容。context.SaveChanges()返回一个值3(与数据库中应该更新的行数相匹配。但是当我查询数据库时,更改并不存在。这太奇怪了。
context.Entry(item).State=EntityState.Modified;
在循环中运行正常,即使不手动修改实体的状态,因为更新是在相同的上下文中执行的。您是否在
结果中获得预期的输出
?您可以尝试在foreach行处/之前添加断点,以确保
结果
不为空。否则,我看不到更改是如何保存的。不需要将状态更改为“已修改”。分配新值已更改此值。调试帮助:通过检查分配后的状态,可以在调试器中查看状态。是否确定结果不是空的?使用:result.Any()。你确定你的作业是更改吗?在你的作业之前检查项的值。你确定没有保存任何内容:检查SaveChanges()的返回值我检查了所有内容。context.SaveChanges()返回值3(与数据库中应该更新的行数匹配。但是当我查询数据库时,更改不在那里。这太奇怪了。他的对象已经是上下文的一部分,他只是在更新它们-绝对没有必要使用
。AddObject
-相反,这将导致错误(因为该对象已经是上下文的一部分!)请删除此答案,这是不正确的,对象已经是上下文的一部分,上下文查询为每个实体提供了迭代的条件。他的对象已经是上下文的一部分,他只是在更新它们-绝对没有必要使用
。AddObject
-相反,这将导致错误(因为该对象已经是上下文的一部分!)请删除此答案,这是不正确的,这些对象已经是上下文的一部分,上下文查询是为每个实体提供迭代权限的查询,我尝试过它,context.SaveChanges()返回值3(与数据库中应该更新的行数相匹配。但是当我查询数据库时,更改不存在。可能您查询的数据库是错误的。)