2016-12-23 1 views
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

예 사실입니다 – user2320476

0

의 질문에 대한 대답을 "는 확인 각 반복에서() SaveChanges를 호출하는 것입니다 ..."예이다. 데이터베이스를 생성 한 직후에 데이터베이스에 객체를 저장하고 싶을 수도 있고 필요로 할 수도 있습니다. 데이터베이스에 트리거가있을 수도 있습니다. 코드의 다음 반복은 이전 객체에 따라 달라질 수 있습니다. 정말로 커다란 값을 모두 저장하면 시간 초과가 발생할 수 있습니다. 각 반복마다 SaveChanges()를 호출하면 데이터베이스에 대한 또 다른 경로가 필요합니다. 제대로 작동해야하고 부분적으로 저장된 콜렉션을 남겨 둘 수 있습니다.

"귀하의 질문에 대한 답변은 ... 더 좋은 방법이 있습니까?" 그것은 달려있다. 대부분의 경우 컨텍스트에 모든 개체를 추가하고 Entity Framework에서 모든 내용을 올바르게 저장하도록합니다. 여기

1. LeadDescriptionId는 2. 당신이 가지고 있지 않거나 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); 
     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 속성이며 다음과 같은 일이

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

가장 쉬운 솔루션을 작동해야 LeadDescription와 LeadMetric 사이의 탐색 속성을 만들 수있는 경우는 줘야 개체를 삽입하는 또 다른 DBContext을 사용하는 것입니다 리터 반환 ID 및 외부 맥락에서이 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(); 
    }