【问题标题】:Edit Id - Store update, insert, or delete statement affected an unexpected number of rows (0)编辑 ID - 存储更新、插入或删除语句影响了意外的行数 (0)
【发布时间】:2012-11-27 15:00:16
【问题描述】:

所以我需要能够在我的编辑页面中连续编辑我的主键字段,我收到错误

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

当我不更改主键字段时,我可以将所有其他更改保存到我的数据库中。

这是我的编辑功能。

//edit - post
[HttpPost]
public ActionResult ActiveCampaignsEdit(ActiveCampaign activecampaign)
{
  try
  {
    if (ModelState.IsValid)
    {
      db.Entry(activecampaign).State = EntityState.Modified;
      db.SaveChanges();
      return RedirectToAction("ActiveCampaigns");
    }
  }
  catch (DataException err)
  {
    //Log the error (add a variable name after DataException)
    ModelState.AddModelError(string.Empty, err.Message);
  }
  ViewBag.TypesList = new SelectList(db.Types, "TypeId", "TypeName");
  ViewBag.CaptureFormsList = new SelectList(db.CaptureForms, "Id", "Name");
  ViewBag.AssignedUsersList = new SelectList(db.Users, "Id", "Username");
  return View(activecampaign);
}

我将如何编辑主键,还是我以错误的方式处理这个?

【问题讨论】:

  • 我不明白反对意见。这个问题对我来说似乎有效且清晰。
  • 谢谢!也许以前有人问过?我花了过去一个小时试图找到一种方法来解决它(搜索这个网站和谷歌),没有运气。
  • 为什么要更改主键? EF 使用主键来标识要更新的记录。当你更改它时,它将无法进行更新
  • 我需要根据标签号访问一行,而不是 ID(如果有意义的话)。标签号需要可编辑且唯一,我还必须将标签号传递给视图,而不是 Id。我是不是走错了路?现在写出来,听起来我有。
  • @GaryKenyon:如果之前有人问过,正确的做法是在参考原始问题的情况下投票结束,而不是对合法问题投反对票(尽管有些人会反对,如果它是非常明显的重复,例如在您输入问题时显示为相关问题的问题)。

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


【解决方案1】:

当使用像实体框架这样的 ORM 时,UPDATE 命令的组成基本上是这样的:

UPDATE table 
SET ChangedCol = ChangedVal 
WHERE PrimaryKeyCol = PrimaryKeyValAtLoadTime

然后它检查受影响的行数以匹配预期值。

因此,当您尝试更改 PK 时,更新命令将不更新任何行,并且检查将失败。

真正的问题是:为什么要更改主键值?

【讨论】:

    【解决方案2】:
    public void Save(object entity)
            {
                using (var transaction = Connection.BeginTransaction())
                {
                try
                        {
                            SaveChanges();
                            transaction.Commit();
                        }
                        catch (OptimisticConcurrencyException)
                        {
                            if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
                                this.Refresh(RefreshMode.StoreWins, entity);
                            else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
                                Detach(entity);
                            AcceptAllChanges(); 
                            transaction.Commit();
                        }
                }
            }
    

    【讨论】:

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