2016-12-23 45 views
2

データベース内の2つのテーブルにデータを書き込むこの方法があります。 foreachセクションのデータベースに と書く必要があるコレクションがあります。それがループの の各反復でsaveChangesを呼び出す場合は大丈夫ですか?これを行うにはより良い方法がありますか?foreachループでdbcontext.savechangesを使用する

  public string SaveInformationToDb(Customerproductdto objDataCollected, List<Productopportunity> objcheckedData) 
       { 
        int generatedLeadDescriptionId = 0; 
        string result = "Failure"; 

        using (var dbcontext = new LEADSEntities()) 
        { 
         using (var dbContextTransaction = dbcontext.Database.BeginTransaction()) 
         { 
          var leadDescription = new LEAD_DESCRIPTION 
          { 
           DETAIL = objDataCollected.LeadDetails, 
           EstimatedRevenue = Convert.ToDecimal(objDataCollected.EstimatedRevenue), 
           CustomerContact = objDataCollected.CustomerContact, 
           CustomerPhone = objDataCollected.CustomerPhone, 
           CustomerEmail = objDataCollected.CustomerEmail 
          }; 
          dbcontext.LEAD_DESCRIPTION.Add(leadDescription); 
          dbcontext.SaveChanges(); 
          generatedLeadDescriptionId = leadDescription.ID; 

          //process data in the collection 
          foreach (var VARIABLE in objcheckedData) 
          { 
           var leadMetric = new LEAD_METRIC 
           { 
            EMPLID = objDataCollected.EmployeeNumber, 
            CustomerNumber = objDataCollected.CustomerNumber, 
            ProductTypeId = GetLeadProductOpportunityId(VARIABLE.ProductName), 
            LeadId = generatedLeadDescriptionId 
           }; 
           dbcontext.LEAD_METRIC.Add(leadMetric); 
           dbcontext.SaveChanges(); 
          } 
          result = "Success"; 
          dbContextTransaction.Commit(); 
         }    
        } 
        return result; 

       } 
+0

あなたは終わりでsaveChanges()を使用することができますし、それが唯一の問題は、彼がID値に依存しているということであるすべてのもの –

+1

節約するには、どのデータベースですIDの代わりにナビゲーションプロパティを使用するようにこのコードを修正する必要があります。私は答えに詳細を記述しました。 –

答えて

1

私はあなたのLEAD_DESCRIPTIONクラスのpublic virtual ICollection<LEAD_METRIC> Metricsのようなナビゲーションプロパティがあるとします。いいえの場合は、それを追加して外部キーにマッピングするように設定する必要があります。そして、あなたは以下のように行うことができます。

public string SaveInformationToDb(Customerproductdto objDataCollected, List<Productopportunity> objcheckedData) 
{ 
    int generatedLeadDescriptionId = 0; 
    string result = "Failure"; 

    using (var dbcontext = new LEADSEntities()) 
    { 
      var leadDescription = new LEAD_DESCRIPTION 
      { 
       DETAIL = objDataCollected.LeadDetails, 
       EstimatedRevenue = Convert.ToDecimal(objDataCollected.EstimatedRevenue), 
       CustomerContact = objDataCollected.CustomerContact, 
       CustomerPhone = objDataCollected.CustomerPhone, 
       CustomerEmail = objDataCollected.CustomerEmail 
      }; 

      //process data in the collection 
      foreach (var VARIABLE in objcheckedData) 
      { 
       var leadMetric = new LEAD_METRIC 
       { 
        EMPLID = objDataCollected.EmployeeNumber, 
        CustomerNumber = objDataCollected.CustomerNumber, 
        ProductTypeId = GetLeadProductOpportunityId(VARIABLE.ProductName) 
       }; 

       leadDescription.Metrics.Add(leadMetric); 
      } 
      result = "Success"; 
      dbcontext.LEAD_DESCRIPTION.Add(leadDescription); 
      dbcontext.SaveChanges(); 
    } 
    return result; 
} 
+0

Lead_Descriptionはテーブルであり、クラスではありません – user2320476

+0

C#コードの 'new LEAD_DESCRIPTION'でインスタンス化しますので、明らかにクラスでもあり、データベース内の同じ名前のテーブルにマップされます –

+0

はいtrue true – user2320476

0

のあなたの質問への答えを、「それはOK、各反復で()SaveChangesメソッドを呼び出すことです...」そうです。データベースを作成した直後にオブジェクトをデータベースに保存したい場合やデータベースにトリガーがある場合、次のコードの反復が以前のオブジェクトに依存している可能性があります。本当に大規模で一度にすべてを保存するとタイムアウトが発生します。各繰り返しでSaveChanges()を呼び出すことは、うまく動作し、部分的に保存されたコレクションであなたを残すことができる、データベースへの別の旅行です。

あなたの質問に対する答えは...それを行うには良い方法がありますか?それは依存しているのですか?ほとんどの場合、すべてのオブジェクトをコンテキストに追加し、Entity Frameworkですべてが正しく保存されるようにします。ここで

は、私は1 LeadDescriptionIdは、IDプロパティあなたが持っていないか、またはLeadDescriptionとLeadMetric

間のナビゲーションプロパティを作成することはできません。2.として設定されていないことを前提条件にするようにコードを更新してしまうものです
public string SaveInformationToDb(Customerproductdto objDataCollected, List<Productopportunity> objcheckedData) 
{ 
    string result = "Failure"; 

    using (var dbcontext = new LEADSEntities()) 
    { 
     var leadDescription = new LEAD_DESCRIPTION 
     { 
      DETAIL = objDataCollected.LeadDetails, 
      EstimatedRevenue = Convert.ToDecimal(objDataCollected.EstimatedRevenue), 
      CustomerContact = objDataCollected.CustomerContact, 
      CustomerPhone = objDataCollected.CustomerPhone, 
      CustomerEmail = objDataCollected.CustomerEmail 
     }; 
     dbcontext.LEAD_DESCRIPTION.Add(leadDescription); 
     dbcontext.SaveChanges(); 
     int generatedLeadDescriptionId = leadDescription.ID; 

     //process data in the collection 
     foreach (var VARIABLE in objcheckedData) 
     { 
      var leadMetric = new LEAD_METRIC 
      { 
       EMPLID = objDataCollected.EmployeeNumber, 
       CustomerNumber = objDataCollected.CustomerNumber, 
       ProductTypeId = GetLeadProductOpportunityId(VARIABLE.ProductName), 
       LeadId = generatedLeadDescriptionId 
      }; 
      dbcontext.LEAD_METRIC.Add(leadMetric); 

     } 
     dbcontext.SaveChanges(); 
     result = "Success";    
    } 
    return result; 
} 

LeadDescriptionIdは、IDプロパティであり、あなたがLeadDescriptionとLeadMetric間のナビゲーションプロパティを作成することができ、このような何かが動作するはず

public string SaveInformationToDb(Customerproductdto objDataCollected, List<Productopportunity> objcheckedData) 
{ 
    string result = "Failure"; 

    using (var dbcontext = new LEADSEntities()) 
    { 
     var leadDescription = new LEAD_DESCRIPTION 
     { 
      DETAIL = objDataCollected.LeadDetails, 
      EstimatedRevenue = Convert.ToDecimal(objDataCollected.EstimatedRevenue), 
      CustomerContact = objDataCollected.CustomerContact, 
      CustomerPhone = objDataCollected.CustomerPhone, 
      CustomerEmail = objDataCollected.CustomerEmail 
     }; 
     dbcontext.LEAD_DESCRIPTION.Add(leadDescription); 

     //process data in the collection 
     foreach (var VARIABLE in objcheckedData) 
     { 
      var leadMetric = new LEAD_METRIC 
      { 
       EMPLID = objDataCollected.EmployeeNumber, 
       CustomerNumber = objDataCollected.CustomerNumber, 
       ProductTypeId = GetLeadProductOpportunityId(VARIABLE.ProductName), 
       LeadId = generatedLeadDescriptionId 
      }; 
      leadDescription.LEAD_METRIC.Add(leadMetric); 
     } 

     dbcontext.SaveChanges(); 
     result = "Success";    
    } 
    return result; 
} 
0

最も簡単な解決策は、ウィルエンティティを挿入するために、別のDBContextを使用する場合リットルのリターン番号と外側の文脈で、このIDを使用

例えば

using (var context = new DatabaseContext()) 
    { 
     ... 
     using (var context1 = new DatabaseContext()) 
     { 
      ... 
       context1.SaveChanges(); 
     }       
     //get id of inserted object from context1 and use is. 
     context.SaveChanges(); 
    } 
関連する問題