2009-05-18 3 views
2

레코드 편집을 허용하는 webapp를 개발 중입니다. 한 번에 두 명의 사용자가 한 번에 같은 화면에서 작업 할 수 있으며 둘 다 클릭하면 저장 한 피해를 최소화하고자합니다.MVC에서 변경된 모델의 속성 만 업데이트하려면 어떻게해야합니까?

User1이 페이지를 요청한 다음 주소, 전화 및 연락처 세부 정보를 변경하지만 저장을 클릭하기 전에 User2가 동일한 페이지를 요청하는 경우

User1은 저장을 클릭하고 TryUpdateModel()을 사용하여 전체 모델을 업데이트합니다. User2가 메모 필드에 일부 정보 만 추가하면 저장하면 TryUpdateModel() 메서드가 User1이 저장 한 새 세부 정보를 이전 정보로 덮어 씁니다. 세부.

모든 모델의 속성에 대한 원래 값을 숨겨진 양식 필드에 저장 한 다음 변경된 속성 만 업데이트하기 위해 사용자 지정 TryUpdateModel을 작성하는 것으로 생각했지만이 역시 우리가 가진 Viewstate와 조금 비슷합니다. MVC로 옮겨 가면서 기꺼이 떠나는 것보다 더 기뻤습니다.

내가 알고있는이 문제를 처리하기위한 패턴이 있습니까?

어떻게 처리하겠습니까?

업데이트 : 아래 의견에 대한 답변에서 Entity Framework를 사용하고 있습니다. 한 사용자가 작업하는 동안 페이지의 수정을 잠금

앤서니

+1

이 작업은 Repository/DataContext 수준에서 처리 할 수 ​​있습니다. 데이터베이스/데이터 액세스 방법은 무엇입니까? –

+0

예 .. 사용하는 ORM을 알려 주시면 대부분의 ORM이 동시 처리 문제를 처리 할 수있는 방법을 제공합니다 (예 : Linq에서 SQL/Entities). 귀하가 설명한 내용입니다. – CraftyFella

답변

3

이 경우 발생하는 특별한 요구 사항이 없으면 (예 : 레코드 잠금, 물론 사용자가 변경하지 않기로 결정한 경우 잠금을 취소 할 수있는 기능이 필요함) 정상적인 접근 방식은 낙관적 인 잠금 장치입니다.

수행하는 각 업데이트는 그 동안 레코드가 변경되지 않았 음을 확인해야합니다.

그래서 :

  1. 정수 "버전"속성 또는 기록에 GUID/rowversion을 넣습니다.
  2. 이것은 html의 숨겨진 필드에 포함되어 있으므로 제출시 함께 반환됩니다.
  3. 업데이트를 수행 할 때 (데이터베이스) 레코드의 버전/guid/rowversion이 숨겨진 필드에 있었던 값과 일치하는지 확인한 다음 [버전] 정수에 1을 추가하십시오.

유사한 접근 방식은 기록에 날짜/시간 스탬프를 사용하는 것이 분명하다]. 그 수동 방식으로 가기로 결정하지만,하지 않는 시스템 시계의 정확도 내에서, 그것은 결함이다, 왜냐하면 .

[전체적인 접근 방법에 대한 자세한 설명은 다른 곳에서도 찾을 수 있습니다. 물론 당신이 NHibernate의 버전 기능에 대한 정보를 구글에 있다면 ...]

0

는 옵션입니다. 이것은 dokuwiki와 같은 일부 wiki 소프트웨어에서 수행됩니다. 이 경우 일반적으로 일부 자바 스크립트를 사용하여 5-10 분 동안 사용하지 않으면 잠금을 해제하여 다른 사용자가 업데이트 할 수 있도록합니다.

또 다른 옵션은 데이터베이스에 모든 개정을 저장할 수 있으므로 두 명의 사용자가 제출할 때 두 사본이 모두 저장되어 여전히 존재합니다. 거기에서부터 두 가지를 합쳐야합니다.

0

일반적으로 처리하지 마십시오. 두 명의 사용자가 동시에 문서를 편집하고 업데이트를 수행하면 그 중 하나가 승리하고 다른 하나는 실패합니다.

리소스 잠금은 상태 기반 데스크톱 응용 프로그램에서 수행 할 수 있지만 웹 응용 프로그램을 사용하면 구현하려는 모든 잠금 구성표가 손상을 최소화 할 수는 있지만 방지하지는 못합니다.

절대적으로 완벽하고 안전한 응용 프로그램을 작성하지 마십시오. 그것은 이미 좋은 상태입니다. 그냥 사용하면 아마도 상황이 전혀 나타나지 않을 것입니다.

+0

응용 프로그램의 특성으로 인해 이러한 상황이 발생할 수 있습니다. – littlecharva

0

LINQ to SQL을 ORM으로 사용하면 충돌 컬렉션을 사용하여 변경된 값 주변의 문제를 처리 할 수 ​​있습니다. 그러나 본질적으로 나는 Mastermind의 의견에 동의 할 것입니다.

관련 문제