我无法想出如何重现这个问题。但这可能与我更新的时间间隔有关。有人见过这个问题吗?或者有人知道这个错误信息是什么意思吗?存储更新、插入或删除语句影响了意外数量的行数 (0)。实体可能已经被修改或删除自从实体被加载以来。刷新ObjectStateManager条目。
编辑:很遗憾,我不能再重现我在这里所遇到的问题,因为我离开了这个项目,并且不记得是否最终找到了解决方案,是否有其他开发人员修复了它,或者我是否解决了它。因此,我无法接受任何答案。
我无法想出如何重现这个问题。但这可能与我更新的时间间隔有关。有人见过这个问题吗?或者有人知道这个错误信息是什么意思吗?存储更新、插入或删除语句影响了意外数量的行数 (0)。实体可能已经被修改或删除自从实体被加载以来。刷新ObjectStateManager条目。
我也遇到过这个问题,原因是忘记在.cshtml编辑页面中包含隐藏的ID输入
这是一种被称为乐观并发的功能带来的副作用。
虽然不确定如何在Entity Framework中启用/禁用它,但基本上它告诉你的是,在你从数据库中获取数据和保存更改之间,有人更改了数据(这意味着当你去保存它时,实际上没有更新任何行)。用SQL术语来说,他们的update
查询的where
子句包含了行中每个字段的原始值,如果影响0行,则知道出了问题。
其背后的想法是,你不会覆盖你的应用程序不知道已经发生了变化的更改 - 它基本上是.NET在所有更新中添加的一项小安全措施。
如果它是一致的,可能是发生在你自己的逻辑内(例如:在选择和更新之间的另一个方法中实际上更新了数据),但也可能只是两个应用程序之间的竞争条件。
哇,很多答案,但当我尝试一些别人没有提到过的东西时,我遇到了这个错误。
长话短说,如果你创建了一个新对象并使用EntityState.Modified
告诉EF它被修改了,那么它会抛出此错误,因为它还不存在于数据库中。以下是我的代码:
MyObject foo = new MyObject()
{
someAttribute = someValue
};
context.Entry(foo).State = EntityState.Modified;
context.SaveChanges();
是的,这似乎很愚蠢,但原因是涉及到该方法之前创建了foo
并将其传递给该方法,现在该方法只接收someValue
并自己创建foo
。
简单解决方法,只需将EntityState.Modified
更改为EntityState.Added
或更改整行为:
context.MyObject.Add(foo);
我遇到了同样可怕的错误... :) 然后我意识到,我忘记设置一个
@Html.HiddenFor(model => model.UserProfile.UserId)
用于正在更新的对象的主键! 我往往会忘记这个简单但非常重要的事情!
顺便说一下:HiddenFor
是针对 ASP.NET MVC 的。
UserId
存储在表单中似乎存在安全漏洞,非常容易受到黑客攻击...应该从HttpContext.Current.User.Identity.Name
中后期填充。 - Serj Sagan这个问题可能是由以下两种情况之一引起的:
Concurrency Mode: Fixed
的行,但乐观并发性阻止了数据保存。也就是说,在您接收到服务器数据和保存服务器数据之间,有人更改了行数据。StoreGeneratedPattern = Computed
),而该行不存在。检查是否在GridView中遗漏了"DataKeyNames"属性,当在GridView内修改数据时,这是必须的。
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx
我之前也遇到过这个错误,因为主键的部分是一个datetime列,而被插入的记录在该列中使用了DateTime.Now作为值。Entity framework会以毫秒精度插入值,然后搜索刚刚插入的值也使用毫秒精度。但是SqlServer将值舍入至秒精度,因此entity framework无法找到毫秒精度的值。
解决方法是在插入之前从DateTime.Now中截断毫秒。
DateTime
值插入到 Date
列中。 - adam0101Bind(Exclude)
属性,导致在HttpPost时实体的ID值为零。namespace OrderUp.Models
{
[Bind(Exclude = "OrderID")]
public class Order
{
[ScaffoldColumn(false)]
public int OrderID { get; set; }
[ScaffoldColumn(false)]
public System.DateTime OrderDate { get; set; }
[Required(ErrorMessage = "Name is required")]
public string Username { get; set; }
}
}
我也遇到了同样的问题,后来发现是由于RowVersion为null引起的。 请确认你的Id和RowVersion都不是null。
欲了解更多信息,请参考本教程:
SELECT SCOPE_IDENTITY() as MyViewId
。 - DannyMeister