뷰를 테이블로 변환하고 변경 내용을 저장하면 낙관적 동시성 예외가 발생합니다.
-
12-12-2019 - |
문제
저는 Entity Framework 4(자체 추적 엔터티 사용)로 작업하고 있으며 두 테이블의 병합인 뷰에 액세스하고 있습니다.따라서 뷰의 정보를 업데이트할 때 뷰의 STE를 데이터베이스에 액세스하는 저장소로 보냅니다.
나는 다음을 수행했습니다.
업데이트된 정보가 포함된 뷰를 받으면 STE1과 STE2를 생성합니다.STE를 생성할 때 이것이 추가된 상태로 생성되는 방법입니다.따라서 상태가 수정된 뷰의 STE 상태를 어떻게 알 수 있으며 다음 메서드를 사용하여 두 STE의 상태를 변경합니다. MarkedAsModified
.
그런 다음 뷰의 STE에 두 테이블의 정보를 가지고 뷰의 정보를 올바른 STE로 전달하고 STE의 변경 사항을 objectContext
.
마지막으로 나는 saveChanges
.하지만 이 단계에서 나는 Optimistic concurrency exception
.제 생각에는 STE가 주에서 다음으로 넘어가기 때문인 것 같습니다. Added
에게 Modified
따라서 컨텍스트는 생성과 생성 사이에 일부 수정이 있음을 감지합니다. SaveChanges
, 하지만 나도 노력하려고 노력해요 AcceptChanges
STE에서 나중에 수정된 것으로 표시되고 변경 사항을 적용하고 마지막으로 SaveChanges
, 그러나 문제는 지속됩니다.
문제를 어떻게 해결할 수 있나요?뷰와 Entity Framework v4를 사용하여 작업하는 더 좋은 방법이 있습니까?
감사해요.다임록.
편집 1:여전히 문제가 있습니다.내 코드는 다음과 같습니다
구성 요소 myComponent = 새 구성 요소();// 이것은 Ste MyComponent.ReReference = MyView.reference입니다....// 기타 속성 myComponent.markedAmsOdified ();//정보를 업데이트하고 싶기 때문에 필요합니다. 새 레지스터를 추가하지 마세요.myContext.ApplyChanges("Components", myComponent);miContexto.SaveChanges();
saveChanges에서 예외가 발생합니다.업데이트, 삽입 또는 삭제 문이 예상치 못한 행 수(0)에 영향을 미쳤습니다.엔터티가 로드된 이후 엔터티가 수정되거나 삭제되었을 수 있습니다.ObjectStateManager 항목을 새로 고칩니다.
어느 것이 문제입니까?새로 생성된 STE를 수정할 수 없나요?
감사해요.
해결책
문제를 해결하는 방법을 찾았습니다.
첫 번째 솔루션에서는 데이터베이스에 쿼리를 작성하여 데이터베이스의 기존 레지스터를 가져오는 것이 해결 방법이었습니다.이렇게 하면 컨텍스트에 엔터티가 추가되고 데이터를 수정하고 변경 사항을 올바르게 저장할 수 있습니다.
그러나 나중에 컨텍스트에 수정된 엔터티를 추가하기 위해 쿼리를 데이터베이스로 만들 필요가 없는 방법을 찾았습니다.
방법은 다음 코드를 사용하는 것입니다.
Customers myCustomer = new Customers { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);
//update the data of the entity.
myContext.SaveChanges();
해결책은 기본 키를 설정하는 새 엔터티를 만드는 것입니다.엔터티가 FK를 보유하는 경우 동일한 방식으로 표시됩니다.이 시점에서 엔터티는 추가된 상태를 갖습니다.
나중에 컨텍스트에 첨부된 다음 수정할 수 있습니다.필드가 변경되면 엔터티의 상태가 수정됨으로 변경되므로 saveChanges()가 호출되면 EF는 엔터티를 업데이트하고 새 엔터티를 추가하려고 시도하지 않습니다.
나는 이 정보를 여기에서 찾았다. 링크.이 게시물의 해결책은 엔터티를 데이터베이스로 검색하지 않고 삭제하는 것입니다. 기존 레지스터를 수정하려는 경우에도 아이디어가 작동합니다.