2011-01-07 3 views
2

EF4와 자체 참조 테이블 (인접성 목록 계층 구조 구현)을 사용하여 this 문제가 발생했습니다.
참고 : 아니요, 다 대다 참조, 단일 테이블의 일대 다 참조.

EF4에서 명백한 버그로 인해 Context.Refresh을 사용하여 간헐적 인 InvalidOperationException ("... ObjectContext가 일치하지 않는 상태 일 수 있음 ...")을 해결하려고 시도합니다.Entity Framework Context.Refresh 버그의 해결 방법은 무엇입니까?

위의 게시물에서 Shimmy의 connect.microsoft.com 링크를 보면 버그가 여전히 우수하다는 것을 알 수있었습니다.
누구나 해결 방법을 권장 할 수 있습니까?
데이터베이스와 Entity Framework의 동기화가 끊어지면 어떻게해야합니까?

편집
도움이 될 수 있습니다 좀 더 사실 :

  1. 을 나는 InvalidOperationException을 얻고 메시지가 말할 때 "데이터베이스에 대한 변경 사항이 성공적으로 최선을 다하고 있었다 ...", 그것은 사실이 아닙니다. 그들은 그렇지 않았습니다. 개체의 ParentId을 1에서 null로 변경하려고했습니다 (ParentIdint?입니다).
  2. 내 개체의 ParentId 특성이 예상 값 (null)으로 올바르게 변경되었습니다. Context.SaveChanges()으로 전화합니다. 그런 다음 예외가 발생합니다. DB를 확인한 결과 이 아니고이 업데이트되었습니다. 이 경우 ParentId은 여전히 ​​데이터베이스에 1입니다.
  3. 안에
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)을 통해 개체를 다시 쿼리하려고하면
    개체의 ParentId은 그대로 유지됩니다. 그것은 (잘못된) 데이터베이스 값에 의해 업데이트되지 않습니다!
    이제 생각해 보니, 좋아, 이상하게 보일지 모르지만 다시 저장하면 DB가 수정됩니다.
  4. catch 안에있는 Context.SaveChanges()을 계속 호출해도 데이터베이스가 업데이트되지 않습니다. (그러나 이번에는 예외가 발생되지 않습니다.)
  5. 내 setParent가 불려 갔을 방법에 새 전화를 걸 경우, myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
    ,
    는 correcly 1 개체의 ParentId 매개 변수, 데이터베이스에서 값을 채 웁니다.

는 또한, 웃음, 나는 개체의 NULL 대신 그것의 자신의 ID에 ParentId는, parentlessness을 표시하기 위해 설정합니다. 이 문제가 발생하지 않아 InvalidOperationException이 발생하지 않았습니다. 그러나 다른 이유로 PITA입니다. 예를 들어, 객체는 추가 자식으로보고합니다.

그래서, 질문은 다음과 같습니다

  • 가 설정하려고에 대해 어떻게 내 자기 참조 예외가 발생 null로 int? ParentId?
  • 예외가 발생하기 전에 데이터베이스가 업데이트되지 않는 이유는 무엇입니까?
  • catch 내부에서 다시 동기화 할 수 없습니까?!

답변

1

다시 쿼리 컨텍스트를 통해 데이터베이스에서 객체 ...

편집 - 당신이 컨텍스트 내에서 개체에 대한 변경 사항을 제출하는 경우 귀하의 갱신에 응답하여, 오류가 일어나는는 사용하여 같은 문맥이 문제 일 가능성이 큽니다. catch to recery에서 컨텍스트를 다시 만들고 다시 업데이트하고 더 나은 결과가 있는지 확인하십시오.

+0

브라이언 (Brian)은 catch에서 컨텍스트를 다시 만드는 것이 resync 문제에 대한 해답 인 것 같습니다. 고맙습니다. 여전히 문제가 처음에 왜 발생하는지는 확실하지 않지만, 적어도 이제는 내 인생에 착수 할 수 있습니다. :) –

+0

오브젝트 컨텍스트는 작업 단위입니다. 데이터베이스에 동기화하는 데 필요한 모든 변경 사항을 유지합니다. 따라서 catch에서 오류가 발생한 객체를 데이터베이스로 푸시하려고합니다. 쿼리를 다시 수행하더라도 OC는 내부 상태로 저장된 쿼리 개체를 반환합니다. –