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は、DBを作成するの世話をし、足場を経て、私は、コントローラとビューを取得:私がやろうとしています

事は単純で、我々はそのような何かを持っているとしましょう。すべてうまく動作し、私は親を作成することができます。ドロップダウンから選択したParentIDの子を作成することもできます。私たちはこれを得た

public IActionResult Create(int id) 
    { 
     if (id == 0) 
     { 
      return NotFound(); 
     } 

     ViewData["ID"] = id; //that a ParentID 
     return View(); 
    } 

とビューに:私は本当に何をしたいのか

はそのようなパラメータとしてのParentIDドロップダウン削除し、合格である

<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'のID列の明示的な値を挿入してください。今私はその場所を見渡し、さまざまな属性を試しましたが、まだこれを動作させることはできません。

私は何らかの助けに感謝します。


更新

コントローラからメソッドを作成します。

[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

実際の 'Child'オブジェクトを構成するコードを投稿できますか?このエラーは、EFがID列としてマークしたフィールドの値を明示的に設定しようとしていることを示しているようです。それが不正確に足場を張らない限り、 '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列に明示的な値が 『子供』を挿入することはできません。」解決します新しいものを作成すると、一意の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は、我々は2つの異なるオブジェクトに同じIDを割り当てないようにします:私はそれを自分で作ることによって、ここにメソッドを作成していることを修正しました。ランダムオプションの代わりに、Guid(idが文字列の場合)またはGetHashCode(おそらく衝突の場合はインクリメント)を使用します。

関連する問題