【问题标题】:Store update, insert, or delete statement affected an unexpected number of rows (0) EntityFramework [duplicate]存储更新、插入或删除语句影响了意外的行数 (0) EntityFramework [重复]
【发布时间】:2013-12-01 10:17:11
【问题描述】:

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

存储更新、插入或删除语句影响了意外 行数 (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; }
}

用户资料

public class UserProfile : Person
{
    public UserProfile()
    {
        Faculty = new Faculty();
        Projects = new Collection<Project>();
        Results = new Collection<Result>();
    }
    public string UserName { get; set; }
    public string CNP { get; set; }
    public virtual Faculty Faculty { get; set; }
    public virtual ICollection<Project> Projects { get; set; }
}

结果

public abstract class Result:INamedEntity
{
    protected Result()
    {
        ResultType = new ResultType();
    }
    public int Id { get; set; }
    public string Name{get;set;}
    public virtual ResultType ResultType { get; set; }
    public virtual ICollection<Person> People { get; set; }
    public DateTime? LastModified { get; set; }
}

在我使用以下方法向上下文添加值之后:

_ctx.Users.Single(u => u.Id == userId).Results.Add(result);

当我拨打_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;
}

但是没有发现错误。 谢谢

【问题讨论】:

  • 首先,您使用的是实体框架代码优先方法,在这种情况下,“名称”属性应标记为“未映射”。
  • 感谢您的回复,但我想允许用户编辑结果的名称
  • 如何创建结果变量?这个结果是从结果表中获取的还是作为新结果创建的?
  • 创建为来自我向用户显示的视图的新结果
  • 这里有更好的解决方案stackoverflow.com/questions/1836173/…

标签: c# asp.net asp.net-mvc entity-framework


【解决方案1】:

将此添加到您的 edit.cshtml

@Html.HiddenFor(model => model.Id)

我遇到了这个问题,发现 ID 显示为 0,因为它不在页面上。

我的 ViewModel 上也有这个(我正在使用视图模型方法)

[HiddenInput(DisplayValue = false)]
[Key]
public int Id { get; set; }

【讨论】:

  • 完全节省了我几个小时的头痛!很棒的收获。
  • 是的,它确实有帮助。谢谢
  • 谢谢@Terry。最佳答案。
  • 我想知道为什么那个字段不在生成的剃须刀中,发现模型中有这个数据注释[ScaffoldColumn(false)]
  • 这本质上是我的问题,但您的解决方案对我不起作用。事实证明,这是因为在我看来,表单位于 @foreach 循环内,并且此类循环中的控件无法正确绑定以在 Razor 中回发。我的解决方案是手动创建 HTML 输入并确保其名称与我绑定的模型字段匹配,而不是使用 @Html.HiddenFor 控件,例如&lt;input type='hidden' name='ID' value='@item.ID' /&gt;
【解决方案2】:

想通了。 问题是我们两个人在做这个项目,我的同事创建了他自己的DBContext 实例,他正在更新一个,而我正在更新另一个。因此,对于将来遇到此问题的人,请确保您没有同时拥有 DBContext 的两个不同实例

【讨论】:

    【解决方案3】:

    对我来说,问题是我没有正确设置 动作绑定

    public ActionResult Edit([Bind(Include = "VehicleID,Name,CreateDate,PowerPS,DrivenKM")] Car car)
        { ... }
    

    VehicleID 映射了错误的标识符,因此实体框架总是将 0 作为主键。

    【讨论】:

      【解决方案4】:

      您的异常意味着在您从数据库中获取数据并对其进行修改之间,您的数据已被更改。

      默认情况下,实体框架实现了一个乐观并发模型。这意味着在查询数据和更新数据之间不会对数据源中的数据进行锁定。 MSDN

      如何在对象上下文中管理并发。MSDN

      或按照刷新上下文的答案进行操作。 StackOverflow

      【讨论】:

      • 试过你所说的来自stackoverflow的版本,但没有捕捉到异常。不知道为什么
      【解决方案5】:

      如果您遇到此问题并且上述解决方案都没有帮助您,也许您可​​以尝试一下。我也有这个奇怪的问题,我能够修复它的方法是我将 a 字段设置为主键并让它自动递增或设置为 Identity。假设您有 Person 表并且您可能有一个 personID,请将其设置为主键并确保它是自动递增的。

      【讨论】:

        【解决方案6】:

        将以下重载添加到我的 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(true)

        【讨论】:

        【解决方案7】:

        存在冲突,因为您使用的是乐观锁定。使用 ObjectStateManager 条目解决并发问题,然后再次保存更改。 MSDN 站点中有一些示例代码。

        【讨论】:

        • 我尝试使用ObjectContext.Refresh,更新了我的帖子,但异常没有被捕获不知道为什么
        【解决方案8】:

        我也遇到了这个错误消息。导致我的错误是主/外键冲突。我已将一些新数据推送到我的数据库中,并且我的外键值已关闭(我的上传脚本中的错误)。

        使用 SQL Profiler 帮助追踪有问题的插入脚本,这可能会帮助您发现更新的问题。

        希望这可以帮助其他有类似问题的人。

        【讨论】:

          【解决方案9】:

          谢谢特里, 让我们添加这个: 搭建脚手架时,请勿将 [Required] 属性添加到您的 Key/ID。 这会阻止您的上下文从 url 中提取 key/id。 还: 迁移后,这发生在我的脚手架控制器中 其中包括模型上的新布尔字段。这些领域是 未设置。

          【讨论】:

            【解决方案10】:

            确保将两个表的 ID 从视图传递给模型。在您的情况下,它是表 Person 和 UserProfile 的键。 如果您不需要在页面上显示 ID,您可以添加 @Html.HiddenFor(model => model.PersonId) 和 @Html.HiddenFor(model => model.UserProfileId)

            【讨论】:

              【解决方案11】:

              我在创建项目时遇到了这个错误,即使只是尝试做一个简单的插入。

              我们从预先存在的数据库生成 EF 模型,框架自动在多个字段上设置 Entity Key = True

              将 ID 以外的所有设置都设置为 False 解决了问题。

              【讨论】:

                【解决方案12】:

                我不知道到底出了什么问题,但我只是做了这些步骤,它得到了解决。 (我希望你能像我一样解决这个问题)
                步骤如下:
                (1) 根据您的 edmx 表和 EF 文件的 DB 上下文,使用脚手架添加新控制器。
                (2) 现在保存更改产生问题的地方是编辑方法。
                (3) 现在复制由脚手架制作的编辑方法/整个控制器,并将其粘贴到您的原始控制器中。
                (4) 现在只需构建程序,你就可以开始了。

                更新
                我发现要从视图中编辑数据,必须将所有字段发送到再次写入控制器。如果在编辑时缺少实体表中的任何字段,则不允许对其进行编辑。特别是如果 PK 在标签中并发送到控制器进行编辑,则会产生此错误。

                【讨论】:

                  【解决方案13】:

                  在我的例子中,我有一个复合键并试图更新它的一部分(3 列构成一个复合键,我只更新第三列)但 EF 不允许更改相同的键值对象,我通过以下方式实现了更新记录:

                  Context.Database.ExecuteSqlCommand(udpateCommand);
                  

                  【讨论】:

                    【解决方案14】:

                    嗯,我在使用 Code First 使用 Entity Framework 6.13 时也遇到了这种类型的并发错误。在自己解决之前,我也挣扎了几个小时。所以它可以帮助那里的人。使用复合主键创建了一个表,今天我更改了表的结构,只创建了一个主键(使用 AutoIncrement)而不是复合键,并通过使用 fluent-api 配置的迁移来更新表。表已更新,但主键未使用 AutoIncrement 更新,每当我尝试添加记录时,它都会显示并发错误。因此,当我设置字段的自动增量时,错误就消失了。希望,它会有所帮助。

                    【讨论】:

                      【解决方案15】:

                      我在谷歌搜索时遇到了这个问题。我有同样的错误信息,但原因是我没有设置一些强制性的非空值。

                      也许这个发现对某人有帮助。

                      【讨论】:

                        【解决方案16】:

                        我修复了一些在尝试更新记录时给出相同错误消息的代码。我最初有以下代码:

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

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多