如何修复“未处理的异常 IDENTITY_INSERT 在 ASP.NET MVC 中设置为 OFF”?

How to fix ‘An unhandled exception IDENTITY_INSERT is set to OFF In ASP.NET MVC'?

我正在开发我的 ASP.NET MVC 项目 (ComputerOwnersDb) 并使用代码优先迁移方法。尽管 IDENTITY_INSERT 设置为 ON,但从单元视图 (Add.cshtml) 来看,我遇到了异常:

'Cannot insert explicit value for identity column in table 'Units' when IDENTITY_INSERT is set to OFF.'

但是当我尝试通过创建迁移插入相同的数据并写入 sql ("INSERT INTO Units VALUES 'Medical Records','Johns Smith'") 时,一切都很好并且记录已成功添加到 Db。 有人可以帮忙吗?

public class Unit
    {
        public byte Id { get; set; }
        [Required]
        public string UnitName { get; set; }
        public string Manager { get; set; }
    }

单位(控制器代码):

public class UnitController : Controller
{
    private ApplicationDbContext _context;

    public UnitController()
    {
        _context = new ApplicationDbContext();
    }

    protected override void Dispose(bool disposing)
    {
        _context.Dispose();
    }


    // GET: Index
    public ActionResult Index()
    {
        var unitList = _context.Units.ToList();
        return View(unitList);
    }

    public ActionResult Add()
    {
        var newUnit = new Unit();
        return View(newUnit);
    }
    public ActionResult Save(Unit unit)
    {
        unit.Id = 0;
        _context.Units.Add(unit);
        _context.SaveChanges();
        return RedirectToAction("Index","Unit");
    }
}

Unit (Add's View Code):

    @model ComputerOwnersDb.Models.Unit
    @{
        ViewBag.Title = "Add";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }

    <h2>Add New Unit</h2>
    @using (Html.BeginForm("Save", "Unit"))
    {
        <div class="form-group">

            @Html.LabelFor(m => m.UnitName)
            @Html.TextBoxFor(m => m.UnitName, new { @class = "form-control" })
        </div>

        <div class="form-group">
            @Html.LabelFor(m => m.Manager)
            @Html.TextBoxFor(m => m.Manager, new { @class = "form-control" })
        </div>

        <button type="submit" class="btn btn-primary">Save</button>
    }
 public ActionResult Save(Unit unit)
 {
     unit.Id = 0;
     _context.Units.Add(unit);
     _context.SaveChanges();
     return RedirectToAction("Index","Unit");
 }

不要明确地将 Id 分配给对象。在没有 Id 的情况下将对象添加到上下文中。数据库将在插入时为您创建 Id,Entity Framework 将捕获并且 return 这个 Id

由于您的 id 是 SQL 服务器 table 中的 INT IDENTITY 列,您需要在 Id 列中添加注释型号 class:

public class Unit
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public byte Id { get; set; }
    [Required]
    public string UnitName { get; set; }
    public string Manager { get; set; }
}

这个 DatabaseGenerated(DatabaseGeneratedOption.Identity) 告诉 EF SQL 服务器将负责为 Id 创建值,EF 将创建一个 INSERT 语句执行 not 明确尝试向 Id 中插入一个值(而是让 SQL 服务器处理该任务)。

现在,一旦您保存了新数据,SQL 服务器将为 Id 创建一个新值并且 EF 将在调用 [=20= 之后显示 Id 值]