0

둘 이상의 사용자가 동시에 변경하고 삭제하고 추가 할 수있는 엔터티 목록 (예 : TODO 항목 목록)이 있다고 가정 해 보겠습니다.ADO.NET Data Services로 "최신 항목 변경됨"을 구현하는 방법은 무엇입니까?

모든 클라이언트간에 나열된 동기화를 유지하려면 각 클라이언트 (AJAX 기반)가 xx 초마다 변경 사항을 묻기를 원합니다. 목록이 길게 늘어날 수 있기 때문에 매번 전체 요청을하고 싶지는 않지만 변경된 항목 (항목은 업데이트되거나 삭제되거나 새로 추가 될 수 있음) 만 요청하십시오.

ADO.NET Data Services에서 가능합니까? 그렇다면 서버에서 Entity Framework를 사용하면 어떻게 구현합니까?

변경 작업을 데이터 서비스에 제출할 때 ASP.NET 캐시를 사용하여 변경 항목을 저장하고 특정 클라이언트가 마지막 요청 (요청이있을 수 있기 때문에 최신 변경 사항을 반환하는 사용자 지정 웹 메서드 사용)을 고려했습니다. 클라이언트 ASP.NET 세션 개체를 통해 추적 됨). 그러나 결과 집합에 개별 항목 (예 : 삭제 또는 업데이트 또는 삽입)의 변경 상태를 나타내는 방법을 모르겠습니다.

또한 훌륭한 해결책은 클라이언트가 서버에 대한 동일한 라운드 트립에서 많은 엔티티의 변경을 요청할 수있게합니다.

모든 입력이 훨씬 쉽게 이루어질 것입니다.

감사합니다. Egil.

답변

1

내 마음에 샘솟는 방법은 테이블에 세대 번호를 사용하는 것입니다. TODO 테이블에 generation이라는 열을 지정하고 (정신적으로) 전역 및 영구 생성 번호 변수와 연관시킵니다. (DB의 테이블에 이것을 넣는 것이 가장 좋습니다.)

업데이트 또는 삽입이 생성 될 때마다 생성 번호가 증가되고 업데이트되거나 삽입 된 레코드의 생성 번호 열에 기록됩니다.

레코드가 DB에서 처음 읽히고 웹 페이지에 올려지면 현재 세대 번호도 로컬에서 검색되고 캐시됩니다 (즉, JavaScript 변수에 저장). 후속 AJAX 기반 읽기는 로컬 캐시 된 세대 번호보다 큰 세대 번호의 레코드 만 필터링하는 where 절을 사용합니다. 이렇게하면 새 업데이트 및 삭제 만 검색됩니다. 그러면 로컬로 캐시 된 세대 번호가 업데이트됩니다.

삭제는 좀 더 까다 롭습니다. 이를 수행하는 한 가지 방법은 제한된 기간 동안 삭제 된 레코드를 삭제 표시하는 것입니다 (예 : 21 분). tombstone이라는 열과 datetime 열이 있습니다. 레코드가 삭제되면 열의 삽입 또는 삭제와 동일한 방식으로 생성 번호가 설정되고 삭제 표시 비트가 설정되며 GetTime()을 사용하여 datetime이 현재 시간으로 설정됩니다. 클라이언트의 AJAX 요청은 tombstone 플래그가 설정된 레코드를 선택하고 클라이언트 쪽 목록에서 레코드를 제거 할 수 있습니다. 클라이언트가 20 분마다 전체 페이지 새로 고침 또는 각 레코드를 가져 오는 아약스 호출이 시행 될 때 DB 작업이 매분마다 실행되고 20보다 오래된 삭제 표시 레코드를 정리 (즉 삭제) 할 수 있도록 코딩 된 경우 의사록.

편집 : 실제로 세대 번호를 별도로 유지할 필요는 없습니다. 생성 열에 대해 SQL 함수 MAX를 사용할 수 있습니다.

+0

크리스토퍼에게 감사드립니다. 귀하의 아이디어는 분명히 효과가 있지만 변경 관리를 데이터베이스에서 지키고 싶습니다. 제 세계에서는 클라이언트와 관련이 있으며 실제로 데이터와 관련이 없습니다. –

+0

어쩌면 당신은 결과 집합을 global.asax에 캐싱하고 거기에 결과 집합에 생성 필드 등을 추가하여 DB를 사용하지 않고 기본적으로 동일한 구성표를 사용할 수 있습니다. 그런 다음 클라이언트의 세대 번호를 세션이나 JS에 캐시하여 업데이트/삽입/삭제를 가져올 수 있습니다. –

+0

데이터베이스에 내 데이터를 저장해야하지만 어떻게 든 결과 집합을 수정할 수 있다면 좋을 것입니다. 나는 EF가 어떻게 그렇게 할 수 있는지 잘 모르겠습니다. –

관련 문제