0

私は以下のような1対多テーブルを持っています。次のコードで既存の行を編集する際に問題が発生しています。私はETの関係にはかなり新しいので、詳細な説明は非常に高く評価されることを理解してください。なぜそれがヌル値を返すのですか?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()  

     } 
    } 

毎回、私はそれがトレポー 'テーブルにnull値を与えて、それをデバッグします。 私の新しい行の作成は、次のコードで完全に機能します。意味、私は正しいフィールド名で正しいフォームを返しています。

あなたが見ることができるように、私はDIパターンを以下の午前、そして以下のようにので、私は私のコントローラでこれらの2つのメソッドを呼び出しています
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(); 

       } 

     } 

:私はそれは私がしたい最後の時間になると思い

[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

1つまたは複数のエンティティの検証に失敗しましたというエラーメッセージが表示されます。詳細については、 'EntityValidationErrors'プロパティを参照してください。 –

答えて

0

ここで質問を投稿すると、私はそれがあなたがどこにでも行くということを理解したので、ちょうど尋ねるならば、私はむしろより多くのことを研究し、それを得るまで私は自分の質問に答えています。

ETから完全に切り離されたWebApiからモデルが生成されるので、データベースを最初に読み込み、追加された子を比較して、&が更新されたことを確認します。完全な1対多のリレーションシップの更新/削除の例を以下に示します。

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(); 
      } 
関連する問題