EF4와 자체 참조 테이블 (인접성 목록 계층 구조 구현)을 사용하여 this 문제가 발생했습니다.
참고 : 아니요, 다 대다 참조, 단일 테이블의 일대 다 참조.
EF4에서 명백한 버그로 인해 Context.Refresh
을 사용하여 간헐적 인 InvalidOperationException
("... ObjectContext가 일치하지 않는 상태 일 수 있음 ...")을 해결하려고 시도합니다.Entity Framework Context.Refresh 버그의 해결 방법은 무엇입니까?
위의 게시물에서 Shimmy의 connect.microsoft.com 링크를 보면 버그가 여전히 우수하다는 것을 알 수있었습니다.
누구나 해결 방법을 권장 할 수 있습니까?
데이터베이스와 Entity Framework의 동기화가 끊어지면 어떻게해야합니까?
편집
도움이 될 수 있습니다 좀 더 사실 :
- 을 나는
InvalidOperationException
을 얻고 메시지가 말할 때 "데이터베이스에 대한 변경 사항이 성공적으로 최선을 다하고 있었다 ...", 그것은 사실이 아닙니다. 그들은 그렇지 않았습니다. 개체의ParentId
을 1에서 null로 변경하려고했습니다 (ParentId
은int?
입니다). - 내 개체의
ParentId
특성이 예상 값 (null)으로 올바르게 변경되었습니다.Context.SaveChanges()
으로 전화합니다. 그런 다음 예외가 발생합니다. DB를 확인한 결과 이 아니고이 업데이트되었습니다. 이 경우ParentId
은 여전히 데이터베이스에 1입니다. - 안에
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
을 통해 개체를 다시 쿼리하려고하면
개체의ParentId
은 그대로 유지됩니다. 그것은 (잘못된) 데이터베이스 값에 의해 업데이트되지 않습니다!
이제 생각해 보니, 좋아, 이상하게 보일지 모르지만 다시 저장하면 DB가 수정됩니다. catch
안에있는Context.SaveChanges()
을 계속 호출해도 데이터베이스가 업데이트되지 않습니다. (그러나 이번에는 예외가 발생되지 않습니다.)- 내 setParent가 불려 갔을 방법에 새 전화를 걸 경우,
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
,
는 correcly 1 개체의ParentId
매개 변수, 데이터베이스에서 값을 채 웁니다.
는 또한, 웃음, 나는 개체의 NULL 대신 그것의 자신의 ID에 ParentId
는, parentlessness을 표시하기 위해 설정합니다. 이 문제가 발생하지 않아 InvalidOperationException
이 발생하지 않았습니다. 그러나 다른 이유로 PITA입니다. 예를 들어, 객체는 추가 자식으로보고합니다.
그래서, 질문은 다음과 같습니다
- 가 설정하려고에 대해 어떻게 내 자기 참조 예외가 발생 null로
int? ParentId
? - 예외가 발생하기 전에 데이터베이스가 업데이트되지 않는 이유는 무엇입니까?
- 왜
catch
내부에서 다시 동기화 할 수 없습니까?!
브라이언 (Brian)은 catch에서 컨텍스트를 다시 만드는 것이 resync 문제에 대한 해답 인 것 같습니다. 고맙습니다. 여전히 문제가 처음에 왜 발생하는지는 확실하지 않지만, 적어도 이제는 내 인생에 착수 할 수 있습니다. :) –
오브젝트 컨텍스트는 작업 단위입니다. 데이터베이스에 동기화하는 데 필요한 모든 변경 사항을 유지합니다. 따라서 catch에서 오류가 발생한 객체를 데이터베이스로 푸시하려고합니다. 쿼리를 다시 수행하더라도 OC는 내부 상태로 저장된 쿼리 개체를 반환합니다. –