2011-01-26 4 views
2

linq를 asp.net C# 웹 응용 프로그램에 사용하는 DataContexts에 몇 가지 문제가 있습니다.외래 키 필드를 업데이트하기 전에 폐기 된 DataContext

내가 처음으로 DataContext를 처리하지 않았으므로 예외가 발생했습니다. 이는 this question과 같은 오류입니다. 나는 왜 적절히 처리되지 않았고, this과 몇 개의 다른 기사를 읽은 후에 정적 데이터 컨텍스트를 사용하여 모든 명령문을 사용하여 확실히 처리 할 수 ​​있도록했습니다.

그러나 DataContext 이미 처리 된 것처럼 외래 키를 업데이트해야 할 때 문제가 발생했습니다. 나는 왜 그것이 이미 처분되었는지,이 시나리오에서 가장 좋은 방법이 무엇인지에 대해 확신 할 수 없기 때문에 어떤 아이디어라도 크게 감사 할 것입니다!

여기

짧은 예 :

업데이트 : 나는 그래서 여기에 더 이상입니다 가능한 한 짧게 만들려고 할 때 내 예를 들어이 너무 복잡하다고 생각 잘하면 더 나은 예 :

private static void SendTexts(List<TextAlert> TextQueue) 
{ 
    using (THTDataContext db = new THTDataContext()) 
    { 
     foreach (TextAlert text in TextQueue) 
     { 
      try 
      { 
       // do IntelliSMS stuff 

       // set status to 'sent' 
       text.Status = 1; 

       db.SubmitChanges(); 
      } 
      catch (IntelliSMSException ex) 
      { 
       // set status to 'failed' 
       text.Status = 2; 

       db.SubmitChanges(); 
      } 
     } 
    } 
} 

감사합니다 ,

Annelie

+1

저는 2 번이 실제로 의미하는 바를 항상 고마워했습니다. 감사합니다! ;) 진지하게도 마법의 숫자가 그날을 보았고, "enum"이 더 효과적 일 것입니다 (다른 것은 없다면 가독성 측면에서). 그리고'Status'가'enum' 타입/값인 경우, 값을 할당하는 것보다 적절한 타입을 사용하는 것이 좋습니다. 주제에서 벗어나, 알아,하지만 괜찮은 정보라고 생각해. –

+0

@ Mr. 실망 스러움 - 하하, 빠른 옵션을 택하는 대신에 시작 했어야했는데, 이제는 나이 먹을 일 목록에 포함되어 있습니다. :) – annelie

+0

Linq2SQL에 의해 생성 된 DB 레코드를 "MyThing"하고 상태가 외래 키 필드입니까? 코드 스 니펫에서 실제로 수행중인 작업을 추측하는 것은 매우 어렵습니다. – Christoph

답변

3

아마도 새로운 내용으로 들어오는 MyThing을 첨부해야합니다. 보관, 제출에가 장착 일단

private static void DoMyStuff(MyThing thing) 
{ 
    using (MyDataContext db = new MyDataContext()) 
    { 
     db.MyThings.Attach(thing); 
     thing.Status = 1; 
     db.SubmitChanges(); 
    } 
} 

이, 컨텍스트가 변경 내용을 추적 할 수 있어야하고이 같은 뭔가 작동 할 수 있습니다.

"이미 처분 된"예외가 해결되지 않으면 이전 컨텍스트를 처리하기 전에 MyThing을 시도 할 수 있습니다. 그러나이 경로를 따라 가야한다면 DataContext의 수명주기가 틀릴 수도 있습니다. 엔티티가 동일한 앱 도메인의 컨텍스트간에 이동하도록 설계되지 않았기 때문입니다.

MSDN의 Dinesh Kulkarni는 첨부/분리 비즈니스에 대해 좀 더 이해하고 싶다면 short blog post입니다.

+0

"새로운 DataContext에서로드되지 않은 엔티티를 첨부 또는 추가하려고했습니다.이 작업은 지원되지 않습니다.",하지만 내가 보낸 링크를 읽고 다시 읽습니다. 나는 그것을 조금 더 잘 이해할 때. 감사! – annelie

+2

@ channelie : 그렇다면 수명주기 문제 일 수 있습니다. 링크는 조금 도움이 될 것이지만, 그 결과로 초기 컨텍스트의 범위를 넓혀서 그 범위 내에서'DoMyStuff'를 할 수 있어야합니다. 일반적인 패턴은 HTTP 컨텍스트 (웹 애플리케이션 인 경우) 또는 스레드 로컬 스토리지 (웹 애플리케이션이 아닌 경우)에 DataContext를 저장하는 것과 관련됩니다. 행운을 빕니다! – ladenedge

+0

그냥 그랬어 지금은 대접! 텍스트 대기열을 가져오고 호출을 보내고 참조를 전달하는 호출을 둘러싼 랩을 사용했는데 왜 시작하지 않았는지 모르겠지만 13 시간 3 일과 내 두뇌 작업을했다고 비난 할 것입니다. 이 기한 전에 더 이상 버그를 고칠 수 없습니다. ;) 정말 고맙습니다! – annelie

3

Yikes! 데이터베이스의 항목을 업데이트하는 동안 예외가 발생하면 예외 처리기에서 데이터베이스의 항목을 업데이트하고 업데이트하는 것이 좋습니다.

여기에 무슨 일이 벌어지고 있는지, thing의 출처는 무엇입니까? MyDataContext의 다른 인스턴스에서 실행 된 쿼리에서 왔습니까? 그렇다면 문제가 바로 그 것입니다.

+0

가능한 한 짧은 예제를 만들었습니다. 사실 IntelliSMSException입니다. 텍스트 메시지를 보내려고하는데, 데이터베이스 예외는 다른 곳에서 처리됩니다. 이런 식으로하는 것은 여전히 ​​나쁜 생각입니까? 그리고 네, 그 물건의 근원은 실제로 다른 경우에 처형되었습니다. – annelie

+1

+1은 submit-catch-submit을 지적합니다. @ channelie, 내가 너라면 내가 특정 예외 유형을 목표로하고 있었다면, 정확한 타입 ('IntelliSMSException')에 대해'catch'를 쓰거나 던져 버리는 코드 주위에만'try' 블록을 감쌀 것입니다. 이 작업을 수행하면 DB 오류를 별도로 처리해야합니다. –

+0

@ 채널 : 그게 문제 야. 이전 인스턴스에서 myThing을 분리하고 새 인스턴스에 연결해야합니다. – jason