2013-10-20 4 views
0

Entity Framework를 통해 레코드를 삽입하는 Customer 테이블이 있습니다. 이 테이블에는 정수 기본 키 (custid)가 있습니다. 컨텍스트에 고객 레코드를 추가하기 전에 마지막으로 사용한 키를 가져 오도록 데이터베이스에 쿼리 한 다음 custid를 1보다 높게 설정합니다.Entity Framework - 레코드를 추가 한 후 필드 값을 변경 하시겠습니까?

그러나 쿼리와 새 레코드를 데이터베이스에 저장하는 사이에 다른 클라이언트가 해당 custid로 레코드를 저장할 수 있으므로 SaveChanges()를 호출 할 때 지금 인하여 예외가 발생합니다 중복 된 가치.

내 계획은 SaveChanges() 호출을 try {} 블록에 넣고 예외를 catch 한 다음 다시 한 번 더 증가시켜 다시 시도하십시오.

내가 custid의 값을 변경하는 방법에 대해 잘 모르겠지만 이제는 컨텍스트에 이미 추가되었습니다.

CUSTOMER myCustomer = new CUSTOMER(); 
myCustomer.FirstName = "John"; 
myCustomer.LastName = "Smith"; 
myCustomer.Custid = GetLastCustid() + 1; 

myContext.CUSTOMERS.Add(myCustomer); 

bool SavedOK = false; 
while (!SavedOK) 
{ 
    try 
    { 
     myContext.SaveChanges(); 
     SavedOK = true; 
    } 
    catch (DBUpdateException e) 
    { 
     if (IsCustidConflict(e)) 
     { 
      // Increment Custid by one 
      // How do I do that????? 
      continue; 
     } 
    } 
} 
+0

기본 키 '자동 증가'옵션을 설정하십시오. 이 모든 것은 데이터베이스 자체에서 처리됩니다! – sarwar026

+0

기존의 프로덕션 데이터베이스라는 점을 제외하고는이 시점에서 동작을 변경할 수 없습니다. – JoeMjr2

답변

1

DbUpdateException 클래스가 지속하는 데 실패하면 항목의 컬렉션을 추출 할 수에서 Entries 특성 포함 : 내 코드는 다음과 같은 것입니다 보조 노트로

catch (DBUpdateException e) 
    { 
     if (IsCustidConflict(e)) 
     { 
      foreach (var entry in e.Entries) 
      { 
        if (entry.Entity is CUSTOMER) 
        { 
         var customer = entry.Entity as CUSTOMER; 
         customer.Custid++; 
        } 
      } 

      continue; 
     } 
    } 

을, 난 당신을 생각 데이터베이스에서 기본 키를 생성하도록 허용하지 않는 이유가 있습니다.

+0

그 덕분에 아름답게 작동했습니다. 감사합니다! – JoeMjr2

관련 문제