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

时间:2019-07-12 12:48:03

标签: asp.net-mvc ef-code-first

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

  

“当IDENTITY_INSERT设置为OFF时,无法在表'Units'中为标识列插入显式值。'

但是当我尝试通过创建迁移插入相同的数据并编写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>
    }

2 个答案:

答案 0 :(得分:1)

由于您的id是SQL Server表中的INT IDENTITY列,因此您需要在模型类的Id列中添加注释:

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 Server将负责为Id创建值,并且EF将创建一个INSERT语句,该语句明确尝试在Id中插入一个值(但可以让SQL Server处理该任务)。

现在,一旦保存了新数据,SQL Server将为Id创建一个新值,并且EF将在调用Id后显示.SaveChanges()的值

答案 1 :(得分:0)

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

没有显式分配Id到对象。将对象添加到不带Id的上下文中。数据库将在插入时为您创建Id,而Entity Framework将捕获并返回此Id