用户更改密钥时保存模型时出错

Error Saving Model when Key has changed by user

我有一个使用字符串而不是 Id 作为键的模型。

public class Item
{
    [Key]
    public string SerialNo { get; set; }

但是,我在保存时遇到问题:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Item model)
{
    if (ModelState.IsValid)
    {
        _db.Entry(model).State = EntityState.Modified;
        _db.SaveChanges();

        return RedirectToAction("Index");
    }

    return View(model);
}

我在更新记录和更改 SerialNo 值时遇到错误:

Store update, insert, or delete statement affected an unexpected number of rows... Entities may have been modified or deleted since entities were loaded.

此错误可能意味着以下某些情况:

  • 如错误提示,可能是因为您从数据库中获取实体(并发),所以该实体已被修改
  • 您的数据库可能不包含具有该 ID 的实体
  • 可能是您在解决方案中使用了 2 个不同的 DBContext

这些是一些可能的事情。

我想发表评论,但我没有这样做的声誉,所以我直接回答了。

试试这个

existedItem = _db.Set<Item>().FirstOrDefault( i=> i.SerialNo == model.SerialNo );
if (existedItem != null)
{           
_db.Entry(existedItem).CurrentValues.SetValues(model);
_db.SaveChanges();
}

like the error only occurs when I edit a record and change the SerialNo field

您不能更新 EF 中的键,通常也不应该更新主键。

如果您确实需要,可以使用原始 SQL 查询,或删除、SaveChanges()、插入。