2012-10-08 2 views
2

낙천적 동시성 검사를 구현하려고합니다. 필자는 일반적인 저장소와 작업 단위 패턴을 사용합니다.타임 스탬프를 무시하는 Entity Framework 엔티티 업데이트

데이터를 업데이트 할 때마다 자동으로 값이 증가하는 Timestamp-attributed 속성 (바이트 배열로)을 도입했습니다 (데이터베이스 관리, 이것이해야 할 일임).

VM을 오토 데스크를 사용하여 실제 모델에 매핑하여 뷰 모델에서 업데이트 된 값을로드합니다. 결과적으로 모든 해당 필드가 설정된 올바른 유형의 엔티티 (타임 스탬프 포함)의 새로운 (분리 된) 인스턴스가 생성됩니다.

업데이트 자체는

i_oEntity가 automapped 엔터티로 되

i_oOldEntity = m_oDbSet.Find(i_oEntity.MaterialId) 
context.Entry(i_oOldEntity).CurrentValues.SetValues(i_oEntity) 
context.SaveChanges() 

같이 수행된다.

이렇게하면 값 자체가 올바르게 업데이트되지만 뷰 모델에서 오는 타임 스탬프 값은 완전히 무시됩니다. 결과 SQL 코드는 WHERE 절에서 최신 rowversion 값을 사용합니다.

간단히 말해, viewmodel-timestamp 값을 EF의 WHERE 절에서 사용하려면 어떻게해야합니까?

답변

-2

OriginalValues->RowVersion를 업데이트하고 당신은 천국에 도착합니다 =)

0

가 가정하십시오

var target = dbContext.Employees.Find(dto.Id); 

이 기술은 EF5이 업데이트 WHERE 절에 DTO의 타임 스탬프 값을 사용하게하고, 낙관적 동시성을 트리거합니다 DTO의 타임 스탬프가 데이터베이스의 타임 스탬프 값과 일치하지 않는 예외 경우 :

context.Entry(target).Property(o => o.Timestamp).OriginalValue = dto.Timestamp; 
context.Entry(target).Property(o => o.Timestamp).IsModified = true; 

혼자 OriginalValue 업데이트는 더하지 않습니다 EF5에서 무엇이든 할 수 있습니다.

관련 문제