如何修复“未处理的异常 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
值]
我正在开发我的 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
值]