2017-12-19 13 views
-1

エンティティフレームワークを初めて使用しています。リストをデータベースに保存する際に問題があります。バインディングを使用してリストオブジェクトをデータベースに保存する

コントローラにメソッドを作成します。データベース内のブログのデータを保存

public async Task<IActionResult> Create([Bind("NieuwsArtikelID,titel,datum,imgNaam")] NieuwsArtikel nieuwsArtikel, 
     [Bind("blog.inleiding", "blog.inleidingTitel")] Blog blog, [Bind("blog.alinea[i].AlineaTitel", "blog.alinea[i].AlineaTekst")] List<Alinea> alineas) 
    { 

     if (ModelState.IsValid) 
     { 
      nieuwsArtikel.blog = blog; 
      nieuwsArtikel.blog.alineas = alineas; 
      _context.Add(nieuwsArtikel); 
      await _context.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 
     return View(nieuwsArtikel); 
    } 

はうまく動作しますが、alineaデータを保存することはできません。それはリストなのでおそらく動作しません。問題は、データベースにリストオブジェクトを保存するにはどうすればいいですか?

NieuwsArtikelクラス:

public class NieuwsArtikel 
{ 
    public int NieuwsArtikelID { get; set; } 
    public string titel { get; set; } 
    public string datum { get; set; } 
    public Blog blog { get; set; } 
    public string imgNaam { get; set; } 
} 

ブログクラス:

public class Blog 
{ 
    public int BlogID {get; set;} 
    public string inleidingTitel { get; set; } 
    public string inleiding { get; set; } 

    public List<Alinea> alineas { get; set; } 
} 

Alineaクラス:

<form asp-action="Create"> 
<div class="form-horizontal"> 
    <h4>NieuwsArtikel</h4> 
    <hr /> 
    <!--Alinea begin--> 
    @for (int i = 0; i < 2; i++) 
    { 

      <div class="form-group"> 
       <label asp-for="blog.alineas[i].AlineaTitel" class="col-md-2 control-label"></label> 
       <div class="col-md-10"> 
        <input asp-for="blog.alineas[i].AlineaTitel" class="form-control" /> 
        <span asp-validation-for="blog.alineas[i].AlineaTitel" class="text-danger"></span> 
       </div> 
      </div> 
      <div class="form-group"> 
       <label asp-for="blog.alineas[i].AlineaTekst" class="col-md-2 control-label"></label> 
       <div class="col-md-10"> 
        <input asp-for="blog.alineas[i].AlineaTekst" class="form-control" /> 
        <span asp-validation-for="blog.alineas[i].AlineaTekst" class="text-danger"></span> 
       </div> 
      </div> 
    } 
    <!-- Alinea eindig--> 
    <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> 

public class Alinea 
{ 
    public int AlineaID { get; set; } 
    public string AlineaTitel { get; set; } 
    public string AlineaTekst { get; set; } 
    public string AlineaQuote { get; set; } 
    public string AlineaFoto { get; set; } 

    public int BlogForeignKey { get; set; } 
    public Blog blog { get; set; } 
} 

ビューを作成します。

私はそれをより読みやすくするために、Alineaフォームグループに入れました。エリーナオブジェクトが外部キーの参照が必要な場合は

+0

あなたの前提は_「おそらくそれはリストなので動作しません」_が間違っています。人々は、何年もの間、Entity Frameworkを使って子エンティティのリストを保存してきました。 [ask]を読んでコードをデバッグしてください。 'alineas'には何が入っていますか?あなたは、正確に何かを意味するのですか?何が起こると予想されますか、実際には何が起こりますか? – CodeCaster

+0

これらの狂った '[Bind]'属性を取り除きます。あなたのメソッドは 'public async Task Create(NieuwsArtikelモデル)' –

+0

である必要があります。 '@for(int i = 0; i <2; i ++)'を使わないでください。 '@for(int i = 0; i

答えて

0
if (ModelState.IsValid) 
    { 
     nieuwsArtikel.blog = blog; 
     nieuwsArtikel.blog.alineas = alineas; 
     _context.Add(nieuwsArtikel); 

     foreach (Aliena a in alienas) 
     { 
      _context.Add(a); 
     } 

     await _context.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 
    return View(nieuwsArtikel); 

さて、あなたは、データベースにID列を使用している場合は、(後でまでnieuwsArtikelオブジェクトのIDを知ることができませんので、それらを個別に保存する必要があります)。そうでない場合は、addを呼び出す前に

a.foreign_key_property_here = nieuwsArtikel.primary_key_property_here 

に変更してください。それだけでいいはずです。

他の方法があります。たとえば、SQLでユーザー定義の表を使用し、ストアド・プロシージャを使用して両方のデータ・セットを一度に送信できます。次に、OUTPUT句を使用して外部キー参照を出力し、alienaレコードを同じトランザクションに保存できます。または、alienaをXMLとして保存されたprocに渡して、そのように保存できます。

+0

_「別々に保存する必要があります」_ - Entity Frameworkがそれを処理します。 UDTについては、SPとXMLのアプローチ:いいえ、まったくありません。これは、ORMを使用する目的全体に勝ちます。 – CodeCaster

関連する問題