C# Store update、insert或delete语句影响了EntityFramework中意外的行数(0)
当我试图保存对上下文所做的更改时,我不断遇到以下错误: 受意外事件影响的存储更新、插入或删除语句 行数(0)。实体可能已被修改或删除,因为 实体已加载。刷新ObjectStateManager条目 我有以下课程: 人C# Store update、insert或delete语句影响了EntityFramework中意外的行数(0),c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,当我试图保存对上下文所做的更改时,我不断遇到以下错误: 受意外事件影响的存储更新、插入或删除语句 行数(0)。实体可能已被修改或删除,因为 实体已加载。刷新ObjectStateManager条目 我有以下课程: 人 public class Person : IPerson { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; }
public class Person : IPerson
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Name
{
get
{
return FirstName + " " + LastName;
}
set{}
}
public string Email { get; set; }
public DateTime? LastModified { get; set; }
public virtual ICollection<Result> Results { get; set; }
}
调用\u ctx.SaveChanges()
将我的功能更新为:
public bool Save()
{
try
{
_ctx.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
((IObjectContextAdapter)_ctx).ObjectContext.Refresh(RefreshMode.ClientWins,_ctx.Users);
((IObjectContextAdapter)_ctx).ObjectContext.Refresh(RefreshMode.ClientWins,_ctx.Results);
_ctx.SaveChanges();
}
return true;
}
但是错误没有被发现。
谢谢由于您使用的是乐观锁定,因此存在冲突。使用ObjectStateManager条目解决并发问题,然后再次保存更改。站点中有一些示例代码。您的异常意味着从数据库中获取数据并对其进行修改的时间间隔内,您的数据发生了更改 默认情况下,实体框架实现乐观并发模型。这意味着在查询数据和更新数据之间,数据源中的数据不会被锁定 如何在对象上下文中管理并发性
或者按照这个答案刷新上下文 将此添加到edit.cshtml
@Html.HiddenFor(model => model.Id)
我遇到此问题,发现ID显示为0,因为它不在页面上
我的ViewModel上也有此功能(我使用的是view model方法)
我明白了。
问题是我们有两个人在做这个项目,我的同事创建了他自己的
DBContext
实例,他在更新一个,我在更新另一个。因此,对于将来有过这个问题的人,请确保不要同时有两个不同的DBContext
实例。我有相同的错误消息,但原因是我没有设置一些强制的非空值
也许这个发现对某人有所帮助。我也遇到了这个错误消息。导致我的错误的原因是主键/外键冲突。我将一些新数据推送到数据库中,外键值被关闭(上传脚本中出现错误) 使用SQL Profiler帮助跟踪有问题的插入脚本,这可能会帮助您发现更新中的问题 希望这能帮助其他有类似问题的人。谢谢Terry, 让我们补充一下: 搭建脚手架时,不要将[Required]属性添加到密钥/ID。 这将阻止上下文从url中提取密钥/id。 也: 迁移后,我在脚手架控制器中遇到了这种情况 其中包括模型上的新布尔字段。这些田地是
未设置。我修复了一些代码,这些代码在尝试更新记录时发出相同的错误消息。我最初有以下代码:
[HttpPost]
public ActionResult Edit(Project project)
{
if (ModelState.IsValid)
{
entity.Entry(project).State = EntityState.Modified;
entity.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View(project);
}
而不是下面的代码
[HttpPost]
public ActionResult Edit(Project project)
{
if (ModelState.IsValid)
{
entity.Entry(project).State = EntityState.Added;
entity.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View(project);
}
确保将两个表的ID从视图传递给模型。在您的例子中,它是表Person和UserProfile的键。 如果不需要在页面上显示ID,可以添加
@Html.HiddenFor(model=>model.PersonId)和@Html.HiddenFor(model=>model.UserProfileId)对我来说,问题是我没有正确设置操作绑定:
public ActionResult Edit([Bind(Include = "VehicleID,Name,CreateDate,PowerPS,DrivenKM")] Car car)
{ ... }
VehicleID映射的标识符错误,因此Entity Framework始终将0作为主键。如果您遇到此问题,并且上述解决方案中没有一个对您有所帮助,也许您可以尝试此方法。我也有这个奇怪的问题,我能够修复它的方法是我将a字段设置为主键,并将其自动递增或设置为标识。假设您有Person表,并且可能有personID,请将其设置为主键,并确保它是自动递增的。我在创建项目时遇到了此错误,即使只是尝试进行简单的插入 我们从预先存在的数据库生成EF模型,框架在多个字段上自动设置
Entity Key=True
将ID设置为
False
解决了问题。我不知道到底出了什么问题,但我只是执行了这些步骤,问题就解决了。(我希望你能像我一样解决这个问题)
步骤如下:
(1)根据edmx表和EF文件的DB上下文,使用脚手架添加新控制器。
(2) 现在,保存更改产生的问题是编辑方法。
(3)现在复制脚手架制作的编辑方法/整个控制器,并将其粘贴到原始控制器中。
(4) 现在只需构建程序,瞧,你就可以开始了 更新
我发现要从视图中编辑数据,必须将所有字段再次发送到控制器进行写入。如果在编辑时实体表中的任何字段丢失,将不允许编辑。特别是如果PK在标签中并发送给控制器进行编辑,则会生成此错误 在我的例子中,我有一个复合键,并试图更新其中的一部分(3列构成一个复合键,其中我只更新第3列),但EF不允许更改同一对象的键值,我通过以下方式更新记录:
Context.Database.ExecuteSqlCommand(udpateCommand);
在使用EntityFramework6.13时,我也遇到了这种类型的并发错误。我也挣扎了几个小时才自己解决。所以它可以帮助其他人。使用复合主键创建了一个表,今天我更改了表的结构,只创建了一个主键(使用AutoIncrement)而不是复合键,并使用fluent api配置通过迁移更新表。表已更新,但主键未使用AutoIncrement更新,每当我尝试添加记录时,它都会显示并发错误。因此,当我设置字段的自动增量时,错误消失了。希望有帮助。将以下重载添加到我的DbContext类中:
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
public class MyDbContext: DbContext {
...
public int SaveChanges(bool refreshOnConcurrencyException, RefreshMode refreshMode = RefreshMode.ClientWins) {
try {
return SaveChanges();
}
catch (DbUpdateConcurrencyException ex) {
foreach (DbEntityEntry entry in ex.Entries) {
if (refreshMode == RefreshMode.ClientWins)
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
else
entry.Reload();
}
return SaveChanges();
}
}
}
然后调用SaveChanges(t
[HttpPost]
public ActionResult Edit(Project project)
{
if (ModelState.IsValid)
{
entity.Entry(project).State = EntityState.Added;
entity.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View(project);
}
public ActionResult Edit([Bind(Include = "VehicleID,Name,CreateDate,PowerPS,DrivenKM")] Car car)
{ ... }
Context.Database.ExecuteSqlCommand(udpateCommand);
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
public class MyDbContext: DbContext {
...
public int SaveChanges(bool refreshOnConcurrencyException, RefreshMode refreshMode = RefreshMode.ClientWins) {
try {
return SaveChanges();
}
catch (DbUpdateConcurrencyException ex) {
foreach (DbEntityEntry entry in ex.Entries) {
if (refreshMode == RefreshMode.ClientWins)
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
else
entry.Reload();
}
return SaveChanges();
}
}
}