0

我一直在遍地搜索,發現很多問題,但他們都沒有回答我的問題。EF將孩子插入特定的父母

一點我試圖做的是簡單的,讓我們說我們有這樣的事情:

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" [email protected]["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(); 
    } 
+0

您可以發佈組成實際的「子」對象的代碼嗎?該錯誤似乎表明您正試圖爲EF標記爲標識列的字段顯式設置一個值。除非它腳手架不正確,'ParentID'不應該是'Child'中的'Identity'列 –

+0

@ stephen.vakil感謝您的回覆,明天我會工作,我將能夠發佈它,但我沒有'除了我所展示的內容之外,沒有什麼改變它會在此行拋出異常「await _context.SaveChangesAsync();」。 – Bielik

+0

將parentID隱藏在窗體內部的視圖上,通過它將返回的信息 – Monah

回答

0

與人交談的意見後,我開始認爲問題是由EF核心的錯誤引起的,但我想我已經找到了解決「髒」的工作。

這裏是兒童模式:

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無法插入表‘兒童’標識列明確的價值。」問題,但創建新的,我們沒有得到唯一的ID。我固定,通過使它自己,這裏創建方法:

[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(並且在可能發生碰撞時增加)。