2011-05-05 4 views
0

내가 얻을 :EF4 - 다른 객체에서 동일한 컨텍스트에서 동일한 테이블 행을 두 번 업데이트 할 수 없습니까? 나도 같은 맥락에서 업데이트하기위한 두 번 같은 테이블 행을받을 때

"는 ObjectStateManager의 다른 개체와 개체의 키 값의 충돌이 키 값이 이전에 고유한지 확인하기 때문에 계속할 수 없습니다 대해 AcceptChanges. AcceptChanges 호출 "

이 문제는 ChangeState 메서드에서 발생합니다.

나는이 단순화 될 수 있습니다 무엇 :

 var obj1 = new test() { id = 1,name = "oiu"}; 
     var dc = Context.Create(); 

     dc.test.AddObject(obj1); 
     if (dc.test.Any(a => a.id == obj1.id)) 
      dc.ObjectStateManager.GetObjectStateEntry(obj1).ChangeState(EntityState.Modified); 
     dc.SaveChanges(); 

     //---- another iteration of the reading thread, another object, but same context: 

     var obj2 = new test() { id = 1, name = "ois" }; 
     dc.test.AddObject(obj2); 
     if (dc.test.Any(a => a.id == obj2.id)) 
      dc.ObjectStateManager.GetObjectStateEntry(obj2).ChangeState(EntityState.Modified); 
     dc.SaveChanges(); 

는 방법은 밖으로 또는 주변 있습니까?

답변

0

개체를 데이터베이스에서로드하거나 Attach 또는 AddObject을 호출하여 한 번만 개체를 ​​컨텍스트에 연결할 수 있습니다. 컨텍스트에 오브젝트를 연결 한 후에는 모든 수정 작업에 동일한 인스턴스를 사용하는 것은 사용자의 책임입니다. 컨텍스트는 ID 맵 패턴을 사용합니다. 즉, 고유 ID (기본 키 및 엔터티 집합을 기반으로하는 엔터티 키)로 개체를 추적하고 주어진 엔터티 키가있는 유형의 인스턴스 하나만 허용합니다. 유일한 예외는 변경 내용을 저장할 때까지 EntityKey이 임시 인 새 개체를 추가하는 것입니다. 그러나 상태를 Modified으로 변경하는 경우에는 예외가 아닙니다.

나머지 테스트에서 인스턴스를 모르면 ObjectStateManager.GetObjectStateEntries을 쿼리하고 인스턴스를 검색 할 수 있습니다 (각 항목의 인스턴스는 Entity 속성을 참조).

+0

Ladislav의 모습을 보여 주셔서 감사합니다. 실제로 나머지 테스트에서는 인스턴스를 모르고 GetObjectStateEntries를 통해 인스턴스를 찾을 수있었습니다. 이렇게하면 obj2를 사용하여 테이블 행을 수정할 수있는 유일한 옵션은 obj1을 먼저 분리하는 것입니다. 그렇다면 내 최고의 옵션은 항상 개체 첨부, ChangeState를 수정, SaveChanges 및 분리입니다. – Juliano

1

그래서 무엇을하려고합니까? EF와 데이터베이스에 "id"가 객체/행의 고유 식별자라고 가정했습니다. 그런 다음 동일한 고유 ID ("1")를 가진 두 개의 객체를 추가하고 작업을 처리하기를 기대한다고 말한 것입니다.

동일한 고유 ID를 가진 객체에 추가 하시겠습니까, 아니면 추가 하시겠습니까? 그런 다음 기존 행/객체를 업데이트하여 name 속성을 "oiu"에서 "ois"로 변경하십시오. 그것이 전자의 경우, "id"를 pkid로 만들지 마십시오. 후자 인 경우 EF에 개체를 두 번 추가하려고한다고 말하지 마십시오. 한번 추가하면 기존 객체를 업데이트합니다.

+0

두 경우 모두 실제로 업데이트됩니다. 나의 행은 처음부터 거기에 있었다. 두 경우 모두 상태를 수정 됨으로 변경합니다. – Juliano

관련 문제