2010-04-02 2 views
2

프로젝트에서 LINQ to Entity를 사용하여 데이터베이스에서 많은 데이터를 가져 와서 개체 묶음으로 구성하고 데이터베이스에 저장합니다. . LINQ to Entity를 사용하기 전에 db에 쓰는 데 문제가 없었지만,이 특정 데이터베이스를 사용하여 문제가 발생했습니다. 여기에 내가 오류가 (! 이것이 "의 InnerException"자체가 쓸모가의 예외입니다)입니다 : 가 세션에서 실행중인 다른 스레드가 있기 때문에LINQ (엔터티) 관련 문제 [레코드 추가]

새로운 트랜잭션이 허용되지 않습니다.

이전에 루프 내에서 변경 사항을 저장하려고 할 때를 보았습니다. 이 경우 루프가 완료되고 해당 호출을 시도합니다. 예외 만 제공합니다.

try 
{ 
    //finalResult is a list of the keys to match on for the records being pulled 
    foreach (int i in finalResult) 
    { 
     var queryEff = (from eff in dbMRI.MemberEligibility 
         where eff.Member_Key == i && eff.EffDate >= DateTime.Now 
         select eff.EffDate).Min(); 

     if (queryEff != null) 
     { 
      //Add a record to the Process table 
      Process prRecord = new Process(); 
      prRecord.GroupData = qa; 
      prRecord.Member_Key = i; 
      prRecord.ProcessDate = DateTime.Now; 
      prRecord.RecordType = "F"; 
      prRecord.UsernameMarkedBy = "Autocard"; 
      prRecord.GroupsId = qa.GroupsID; 
      prRecord.Quantity = 2; 
      prRecord.EffectiveDate = queryEff; 

      dbMRI.AddObject("Process", prRecord); 
     } 
    } 

    dbMRI.SaveChanges(); //<-- Crashes here 

    foreach (int i in finalResult) 
    { 
     var queryProc = from pro in dbMRI.Process 
         where pro.Member_Key == i && pro.UsernameMarkedBy == "Autocard" 
         select pro; 

     foreach (var qp in queryProc) 
     { 
      Audit aud = new Audit(); 
      aud.Member_Key = i; 
      aud.ProcessId = qp.ProcessId; 
      aud.MarkDate = DateTime.Now; 
      aud.MarkedByUsername = "Autocard"; 
      aud.GroupData = qa; 

      dbMRI.AddObject("Audit", aud); 
     } 
    } 

    dbMRI.SaveChanges();   //<-- AND here (if the first one is commented out) 
} 
catch (Exception e) 
{ 
    //Do Something here 
} 

는 기본적으로,이 레코드를 삽입하는 삽입 레코드에 대한 정체성을 얻을 첫 번째 레코드에서 신원과 다른 테이블에 레코드를 삽입 할 필요 : 여기에 현재 코드입니다. 몇 가지 다른 제약 조건을 감안할 때, 두 가지간에 FK 관계를 생성 할 수는 없습니다 (하지만 시도한 적이 있지만 앱의 다른 부분에서는 허용되지 않으며 FK를 싫어하는 이유로 DBA 팀이 다른 주제 :))

어떤 아이디어가 원인 일 수 있습니까?

감사합니다.

편집 : 태그를 업데이트 해 주셔서 감사합니다.

+1

1) 앱이 멀티 스레드입니까? 2) dbRMI의 범위는 무엇입니까? 충분히 신선합니까? – Henri

+0

1) 멀티 스레드로 만들지 않았으므로 그렇지 않다고 말할 것입니다. 2) dbMRI에는 컨트롤러에 대한 전역 범위가 있습니다. 3) 당신이 신선한 것이 무엇을 의미하는지 모르겠습니다 ... – SlackerCoder

답변

10

문제는 오픈 어딘가에있는 것입니다. 해결 방법은 데이터를 선택했는지 확인하고 SaveChanges()를 호출 할 때 쿼리에서 열거되지 않도록하는 것입니다.

내 생각에 finalResult는 Queryable이므로 ToList(), ToArray() 등을 추가하거나 우리가 보낸 블록은 linq 쿼리에서 열거 된 큰 블록 안에 있습니다.

+2

이것은 해냈습니다. 나는 "부모"foreach 루프를 보지 못했다고 믿을 수 없다. 분명히 상위 쿼리를 .ToList()로 만들고 쿼리 대신 목록을 반복하면 도움이됩니다. Thanks. 이걸 찾으려면 올바른 방향으로 밀어야했습니다! – SlackerCoder

+0

이 답변을 주셔서 감사합니다. Nix. 내 문제를 정확하게 해결했습니다. 나는 foreach 루프를 가지고 foreach가 내 쿼리의 .ToList'd 버전을 차례로 열거한다는 것을 잘못 가정했다. –