Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Store update、insert或delete语句影响了EntityFramework中意外的行数(0)_C#_Asp.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# Store update、insert或delete语句影响了EntityFramework中意外的行数(0)

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; }

当我试图保存对上下文所做的更改时,我不断遇到以下错误:

受意外事件影响的存储更新、插入或删除语句 行数(0)。实体可能已被修改或删除,因为 实体已加载。刷新ObjectStateManager条目

我有以下课程:

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();
            }
        }
}