簡體   English   中英

EF將孩子插入特定的父母

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM