2009-05-12 3 views
0

asp.net MVC 응용 프로그램에서 낙관적 잠금을 구현하려고하고 감사 추적 기능을 제공하려고합니다.linq datacontext 첨부 시나리오의 GetModifiedMembers

감사 프레임 워크는 SubmitChanges 중에 DataContext.GetModifiedMembers를 호출 할 수 있어야합니다. 이는 좋은 생각입니다.

낙관적 잠금은 ROWVERSION 시간 소인을 사용하여 base64로 일련 화되고 뷰의 숨겨진 필드에 놓입니다.

내 편집 작업은 다음과 같습니다

[AcceptVerb(HttpVerb.Post)] 
public ActionResult Edit(MyType myType) 
{ 
    context.MyTypes.Attach(myType, true); 
    context.SubmitChanges(ConflictMode.FailOnFirstConflict); 
} 

이 일의 DataContext.GetModifiedMembers는 항상 데이터베이스 사이에 변경 한 값이 제공됩니다 단지 사람보다는합니다 MyType에 대한 모든 속성을 반환합니다 , 감사가 중단됩니다. 특히 모든 속성을 새 값에서 새 값으로 변경 한 것으로 반환하므로 목록에 영리한 기능을 수행 할 수 없습니다.

개체를 연결하기 전에 개체를 먼저로드하려고 시도했지만 중복 키 예외가 발생합니다. 그때 UpdateModel를 사용하여 시도

, 즉

[AcceptVerb(HttpVerb.Post)] 
public ActionResult Edit(int id, FormCollection col) 
{ 
    var mt = context.MyTypes.Single(mt => mt.id = id); 
    UpdateModel(mt); 
    context.SubmitChanges(ConflictMode.FailOnFirstConflict); 
} 

이 감사와 함께 작동하지만 낙관적 잠금을 실패합니다. UpdateModel이 concurrentTS 필드를 변경하기 때문에 ChangeConflictException 대신 InvalidOperationException이 발생합니다 (이는 분명히 읽기 전용입니다).

내가 뭘 잘못하고 있니?

답변

0

진행률은 마지막 부분을 수행하고 InvalidOperationException을 포착하여 "값 'ConcurrencyTimestamp'"텍스트를 찾고이를 ChangeConflictException으로 재실행하는 것으로 구성됩니다.

트릭을하는 것처럼 보이지만 예쁜 것은 아닙니다.

관련 문제