我正在使用实体框架来填充网格控件。有时当我进行更新时,我得到以下错误:
存储更新、插入或删除语句影响了意外的行数(0)。实体可能在加载实体后已被修改或删除。刷新ObjectStateManager条目。
我不知道怎么复制这个。但这可能和我更新的时间间隔有关系。有人见过这个吗,或者有人知道错误消息指的是什么吗?
编辑:不幸的是,我不再有自由重现我在这里遇到的问题,因为我离开了这个项目,不记得我最终是否找到了解决方案,是否有其他开发人员修复了它,或者是否我绕过了它。因此我不能接受任何回答。
我正在使用实体框架来填充网格控件。有时当我进行更新时,我得到以下错误:
存储更新、插入或删除语句影响了意外的行数(0)。实体可能在加载实体后已被修改或删除。刷新ObjectStateManager条目。
我不知道怎么复制这个。但这可能和我更新的时间间隔有关系。有人见过这个吗,或者有人知道错误消息指的是什么吗?
编辑:不幸的是,我不再有自由重现我在这里遇到的问题,因为我离开了这个项目,不记得我最终是否找到了解决方案,是否有其他开发人员修复了它,或者是否我绕过了它。因此我不能接受任何回答。
当前回答
如果您试图在edmx文件中创建到“function Imports”的映射,则可能会导致此错误。只要清除位于edmx中给定实体的映射细节中的插入、更新和删除字段,它就应该工作了。 我希望我讲清楚了。
其他回答
您需要显式地包含主键的BoundField。如果你不想让用户看到主键,你必须通过css隐藏它:
<asp:BoundField DataField="Id_primary_key" ItemStyle-CssClass="hidden"
HeaderStyle-CssClass="hidden" />
其中'hidden'是css中的一个类,它的显示设置为'none'。
在我们的例子中,这个错误是由于将实体标记为已修改,而它们的属性并没有“真正”改变。例如,当你将相同的值赋给一个属性时,上下文可能会将其视为更新,而数据库则不会。
基本上,我们运行了一个脚本,用来自其他属性的连接值重新填充一个属性。对于很多记录来说,这意味着没有变化,但它将它们标记为修改。DB返回不同数量的更新对象,这可能触发了该异常。
我们通过检查属性值并仅在不同的情况下分配新的值来解决这个问题。
我得到了这个异常,我设置id列为自动增量在我的数据库的表,然后它工作得很好
当附加一个数据库中不存在的对象时,我得到了这个异常。我假定对象是从单独的上下文中加载的,但如果这是用户第一次访问站点,则从头创建对象。我们有自动递增的主键,所以我可以替换
context.Users.Attach(orderer);
with
if (orderer.Id > 0) {
context.Users.Attach(orderer);
}
当我在数据库中删除一些行(在循环中),并在同一表中添加新的行时,我得到了这个错误。
我的解决方案是,在每个循环迭代中动态地创建一个新的上下文