2017-12-19 6 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); 
    } 

가 잘 작동하지만, 알리 니아 데이터를 저장하는 것은 작동하지 않습니다

컨트롤러 방법을 만듭니다. 그것이 목록이기 때문에 아마 작동하지 않습니다. 문제는 다음과 같습니다. 데이터베이스에 목록 개체를 저장하려면 어떻게해야합니까?

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; } 
} 

알리 니아 클래스 :

<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 양식 그룹 만 넣었습니다. Aliena 객체는 외래 키 참조를 필요로하는 경우

+0

가정 사항 _ "목록이기 때문에 작동하지 않습니다"_가 잘못되었습니다. 사람들은 수년간 Entity Framework를 사용하여 하위 엔터티 목록을 저장했습니다. [ask]를 읽고 코드를 디버그하십시오. 'alineas'에는 무엇이 들어 있습니까? 알레 사 데이터를 저장하면 효과가 없다는 것은 무엇을 의미합니까? _? 어떤 일이 일어날 것으로 예상합니까? 실제로 어떻게됩니까? – CodeCaster

+0

미친'[Bind]'속성을 제거하십시오. 당신은'public async Task Create (NieuwsArtikel model)' –

+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); 

이제, 당신은 당신이 데이터베이스에 신원 열을 사용하는 경우 당신이 (나중에까지 nieuwsArtikel 개체의 ID를 알 수 없습니다 때문에 별도로 저장해야). 사용하지 않으려면 add를 호출하기 전에

a.foreign_key_property_here = nieuwsArtikel.primary_key_property_here 

으로 변경하십시오. 그걸로 잘해야합니다.

다른 대안이 있습니다. 예를 들어 SQL에서 사용자 정의 테이블을 사용할 수 있으며 저장 프로 시저를 사용하여 두 데이터 세트를 한 번에 보낼 수 있습니다. 그런 다음 OUTPUT 절을 사용하여 외래 키 참조를 출력하고 aliena 레코드를 동일한 트랜잭션에 저장할 수 있습니다. 또는 XML로 aliena를 저장된 proc에 전달하고 그런 식으로 저장할 수 있습니다.

+0

_ "별도로 저장해야합니다"_ - Entity Framework에서 처리합니다. UDT에 관해서는 SP와 XML이 접근합니다 : 아니오, 아니오. 그것은 ORM 사용의 모든 목적을 능가합니다. – CodeCaster