0

아래의 1 대 다수 테이블을 가지고 있습니다. 다음 코드를 사용하여 기존 행을 편집 할 때 문제가 발생합니다. 나는 동부 표준시 관계에 꽤 새로운 것을 이해하므로 자세한 설명은 크게 감사하겠습니다. null 값을 반환하는 이유는 무엇입니까? Entity Framework를 사용하여 기존 행을 업데이트하는 방법?

enter image description here

public void UpdateReportGroup(TReportHeaderModel model) 
    { 

     if (model.THeaderTitle == null) 
     { 
      throw new Exception("Report Group Title must be filled in"); 

     } 

     if (model.THeaderTitle.Length <= 0) 
     { 
      throw new Exception("A Report Group Title must be filled in."); 

     } 
     using (var connection = new TReportEntitiesConnection()) 
     { 

      var header = connection.THeaders.SingleOrDefault(f => f.ID == model.ID); 
      var reports = connection.TReport.Where(f => f.THeaderID == model.ID); 
      connection.TReport.RemoveRange(reports); 
      foreach (var urls in model.TReports) 
      { 
       connection.TReport.Add(new TReport() 

       { 
        TReportName = urls.name, 
        URL = urls.url, 
       }); 
      } 
      connection.THeaders.Add(header); 
      connection.SaveChanges()  

     } 
    } 

매번

, 나는 그것이 'TReport'테이블에 null 값을주고, 그것을 디버깅합니다. 내 새 행 만들기는 다음 코드로 완벽하게 작동합니다. 의미, 올바른 필드 이름으로 올바른 양식을 반환합니다. 당신이 볼 수 있듯이

public void CreateReport(TReportHeaderModel model) 
     { 


      if (model.THeaderTitle == null) 
      { 
       throw new Exception("Report Group Title must be filled in"); 

      } 

      if (model.THeaderTitle.Length <= 0) 
      { 

       throw new Exception("A Report Group Title must be filled in."); 

      } 

       using (var connection = new TReportEntitiesConnection()) 

       { 
        var header = new THeader() 
        { 
         ClientID = model.ClientID, 

         THeaderTitle = model.THeaderTitle, 
         RowNumber = model.RowNumber 
        }; 


        foreach (var urls in model.TReports) 
        { 

         header.TReports.Add(new TReport() 
         { 

          TReportName = urls.name, 
          URL = urls.url 


         }); 

        } 

        connection.THeaders.Add(header); 
        connection.SaveChanges(); 

       } 

     } 

것은, 내가 DI 패턴을 다음하고, 따라서 나는 아래로 내 컨트롤러에서이 두 가지 방법을 호출 오전 :

[HttpPost] 
     public ActionResultModel CreateReportAPI([FromBody] TReportHeaderModel model) //attempt 3 
     { 

      try { 
       if (ModelState.IsValid) 
       { 
        var isValid = _tReportingService.HeadernameExists(model.THeaderTitle); 

        if (!isValid) 

        { 
         Console.WriteLine("it does not exist"); 
         var user = this.GetCurrentUserAccount(); 
         model.ClientID = user.SelectedClient.ID; 

         _tReportingService.CreateReport(model); 

        } 

        else //Update method comes till here and it goes //straight to the error 
        { 

         Console.WriteLine("it exists"); 
         var user = this.GetCurrentUserAccount(); 
         model.ClientID = user.SelectedClient.ID; 

         _tReportingService.UpdateReportGroup(model); 

        } 
       } 


       return new ActionResultModel() 
       { 

        Success=true, 
        Message="Report Group Successfully Saved." 


       }; 




      } 
+0

TReport 검색을위한 Where 문 다음에 ToList()를 추가하십시오. – master2080

+0

@ master2080 했어. 그것은 여전히 ​​나에게 오류를주고있다. –

+0

하나 이상의 엔터티에 대한 유효성 검사가 실패했습니다.라는 오류 메시지가 나타납니다. 자세한 내용은 'EntityValidationErrors'속성을 참조하십시오. –

답변

0

나는 내가했던 마지막 시간이 될 것 같아요 여기에 질문을 올리는 것은 내가 묻는다면 아무데도 데려다 줄 것을 이해함에 따라 여기에서 질문을 게시합니다. 오히려 더 많은 것을 연구하고 계속 시도해 볼 때까지 계속 노력할 것입니다.

모델이 ET에서 완전히 분리 된 WebApi에서 생성되면 데이터베이스를 먼저로드하고 어떤 자식이 추가되었는지 비교하고 삭제 된 &이 삭제되었는지 비교합니다. 다음은 완벽한 일대 다 관계의 업데이트/삭제의 예입니다.

using (var connection = new TReportEntitiesConnection()) 
      { 

       var header = connection.THeaders.Include("TReports").SingleOrDefault(f => f.ID == model.ID); 

       if (header != null) 
       { 
        header.THeaderTitle = model.THeaderTitle; //update parent 
       } 
       foreach (var existingChild in header.TReports.ToList()) 
       { 

        if (!model.TReports.Any(c => c.ID == existingChild.ID)) 
         connection.TReport.Remove(existingChild); 

       } 
       foreach (var url in model.TReports) 
       { 
        var existingChild = header.TReports 
         .Where(c => c.ID == url.ID) 
         .SingleOrDefault(); 


        if (existingChild != null) 
        { //update child 
         connection.Entry(existingChild).CurrentValues.SetValues(url); 
        } 
        else 
        { 
         var newChild = new TReport 
         { 
          TReportName = url.name, 
          URL = url.url, 
         }; 

         header.TReports.Add(newChild); 
        } 
       } 
       connection.SaveChanges(); 
      } 
관련 문제