【发布时间】:2016-09-08 16:57:02
【问题描述】:
我一直在到处寻找,发现了很多问题,但他们都没有回答我的问题。
我想做的事情很简单,假设我们有这样的事情:
public class Parent
{
public int ID { get; set; }
public List<Child> Children { get; set; }
}
public class Child
{
public int ID { get; set; }
public int ParentID { get; set; }
public Parent Parent { get; set; }
}
EF 负责创建数据库并通过脚手架获得控制器和视图。一切正常,我可以创建父级。我还可以使用从下拉列表中选择的 ParentID 创建 Child。
我真正想做的是删除下拉菜单并将 ParentID 作为参数传递:
public IActionResult Create(int id)
{
if (id == 0)
{
return NotFound();
}
ViewData["ID"] = id; //that a ParentID
return View();
}
我们得到了这个:
<form asp-action="Create">
<div class="form-horizontal">
<h4>Child</h4>
<hr />
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="ParentID" value=@ViewData["ID"] />
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
</form>
提交时,我得到“当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Children' 中插入标识列的显式值。”现在我环顾四周并尝试了各种属性,但仍然无法正常工作。
我将不胜感激。
更新
从控制器创建方法:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,ParentID")] Child child)
{
if (ModelState.IsValid)
{
_context.Add(child);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(book);
}
只是为了展示更多关于问题的信息。这里我使用默认的脚手架版本,视图中带有选择控件。
public IActionResult Create(int id)
{
if (id == 0)
{
return NotFound();
}
ViewData["ParentID"] = new SelectList(_context.Parents.Where(x => x.ID == 1), "ID", "ID"); //Works
ViewData["ParentID"] = new SelectList(_context.Parents.Where(x => x.ID == id), "ID", "ID"); // Doesn't work
return View();
}
【问题讨论】:
-
您能发布构成实际
Child对象的代码吗?该错误似乎表明您正在尝试为 EF 标记为标识列的字段显式设置值。除非它的脚手架不正确,否则ParentID不应该是Child中的Identity列 -
@stephen.vakil 谢谢你的回复,明天我会上班,我可以发布它,但除了我展示的内容外,我没有改变任何东西。它在“await _context.SaveChangesAsync();”这一行抛出异常。
-
将 parentID 存储为隐藏在表单内的视图中,这样它将与帖子一起返回
-
@HadiHassan 我不明白......我想我已经这样做了,参数很好地进入控制器,通过模型验证并在保存对数据库的更改时抛出异常。
-
我没有仔细看你的问题细节,ID字段是否标记为DatabaseGenerated as Identity?
标签: c# entity-framework asp.net-core entity-framework-core identity-insert