[英]EF Insert Child to specific Parent
我到處搜尋,發現許多問題,但沒有一個回答我。
我想做的事情很簡單,假設我們有這樣的事情:
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負責創建數據庫,並通過腳手架獲得控制器和視圖。 一切正常,我可以創建Parent。 我也可以使用從下拉列表中選擇的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'中的Identity列插入顯式值”。 現在我環顧四周,嘗試了各種屬性,但仍然無法正常工作。
我將不勝感激。
更新資料
從控制器創建方法:
[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();
}
在評論中與人交談之后,我開始認為問題是由EF Core中的錯誤引起的,但我認為我發現“臟”的解決方法。
這是子模型:
public class Child
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ID { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ParentID { get; set; }
[ForeignKey("ParentID")]
public Parent Parent { get; set; }
}
現在(由於某種原因)解決了“當IDENTITY_INSERT設置為OFF時,無法在表'Children'中為Identity列插入顯式值”。 問題,但創建了新的,我們沒有唯一的ID。 我通過自己修復此問題,這是create方法:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,ParentID")] Child child)
{
if (ModelState.IsValid)
{
int _id;
do
{
_id = new Random().Next();
} while (await _context.Children.Where(b => b.ID == _id).AnyAsync());
child.ID = _id;
_context.Add(child);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
ViewData["ID"] = id;
return View(child);
}
現在,doWhile確保我們不會將相同的ID分配給兩個不同的對象。 隨機選項的替代方法是使用Guid(當id為字符串時)或GetHashCode(並在發生沖突的情況下遞增)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.