我正在研究我的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>
}
答案 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
。