2011-01-31 3 views
15

지금까지 성공한 데이터베이스에서 데이터를 조작하기 위해 Entity Framework를 사용하고 있습니다.엔터티 프레임 워크 - 기본 데이터 (데이터베이스) 변경 알림

그러나 한 번에 두 개 이상의 응용 프로그램에서 동시에 데이터를 재생하려고합니다 (동시 버전).

데이터베이스의 데이터가 변경 될 때 알림을받을 수있는 방법이 있습니까?

DML 트리거를 사용하여 솔루션을 보았지만이를 달성 할 수있는 다른 방법이 있는지 알고 싶습니다. 그렇다면 사용할 수있는 최상의 솔루션은 무엇입니까?

감사합니다,

편집

어쩌면 내 질문에 내가 예하여 설명하려고합니다, 충분히 명확하지 않았다.

  • 애플리케이션 # 1은 1
  • 애플리케이션 # 2는 애플리케이션 # 1이 변화에 의해 반사되는 엔티티 모델을 변경 한
  • 데이터베이스에 # 엔티티 프레임 워크를 사용하는 데이터베이스에 # 엔티티 프레임 워크를 사용 데이터베이스 # 1의 기본 테이블
  • 응용 프로그램 # 2가이 변경 사항을 통보 받아 일관된/up2date 데이터를 가질 수있게하려고합니다.
+0

위대한 질문! 같은 문제/질문 : http://stackoverflow.com/questions/11627959/entity-framework-data-updates-in-a-multi-user-environment-with-central-database – juFo

+0

나는 또한 같은 문제가있다 –

답변

5

아마 당신은 응용 프로그램에서 EF의 사용에 대해 생각해야한다.

  • 만들기 컨텍스트
  • 데이터로드
  • 수정 데이터
  • 데이터를 저장
  • 드롭 컨텍스트

때문에의 : EF의 상황은 가능한 시간 등 짧은 기간 동안 사용되어야한다 내부 구현 (IdentityMap, UnitOfWork) 긴 살아있는 컨텍스트는 좋은 선택이 아니며 짧은 생존 컨텍스트에서는 알 수없는 동작을 원하지 않습니다. 엘. 데스크톱 애플리케이션에서도 폼마다 컨텍스트와 같은 접근 방식을 사용해야합니다. 데이터를로드하고 사용자에게 데이터를 표시하고 그 시간까지만 사용자가 데이터를 수정하고 저장 버튼을 누를 수 있습니다. 어쨌든 동시성 문제를 처리하는 것은 응용 프로그램 책임입니다 (타임 스탬프). 작업 단위 (UOW)의 일부인 데이터의 자동 수정은 매우 나쁜 생각입니다. 사용자가 이미 데이터를 수정 한 경우는 어떻게됩니까? 그의 변경 사항을 덮어 씁니까?

편집 :

당신은 ObjectContexthere의 구현에서는 정상적에 대한 자세한 내용을보실 수 있습니다.

클라이언트 응용 프로그램에 대한 데이터 업데이트 알림이 필요한 시나리오를 상상할 수 있습니다. 읽기 전용 실시간 데이터 표시 (예 : 주식 거래 정보) 일 수 있습니다. 그러나 그런 경우에 당신은 더 강력한 것을 필요로합니다. ORM이 데이터를 가져 오는 클라이언트 호출 시나리오는 아니지만 데이터 검색 및 빠른 변경 알림을 처리하는 일부 서비스/중간 계층에 가입하는 클라이언트 시나리오입니다.

세미 실시간으로 데이터를 새로 고쳐야하는 간단한 시나리오의 경우 폴링을 사용할 수 있습니다. 클라이언트는 몇 초 내에 다시 쿼리를 호출하고 StoreWins 전략을 사용합니다. 모든 알림 전략은 EF의 범위 밖에 있습니다. 트리거, SQL 종속성, 구독 패턴 또는 다른 것을 게시해야합니다. 알림을 사용하더라도 일부 이벤트 만 처리하고 데이터를 다시 쿼리 할 수 ​​있습니다.

폴링을 사용하여 데이터 전송을 줄이려면 일정 수준의 캐싱을 허용하는 일부 서비스/중간 계층이 필요합니다 (WCF 데이터 서비스를 사용해 볼 수도 있음).

+0

이 답변은 완전히 주제입니다. 설문 조사에 대한 귀하의 대답은 질문에 대한 질문입니다. 폴링을 방지합니다. –

+0

https://code.msdn.microsoft.com/How-to-use-SqlDependency-5c0da0b3 –

2

데이터베이스 수준에서 timestamp 열을 테이블에 넣고이를 사용하여 검색 후 행이 업데이트되었는지 알 수 있습니다. 이것은 당신이 제안한대로 또는 C# 코드의 모니터링 시스템에 의해 트리거를 점검하거나 변경 사항을 덮어 쓰지 않으려는 경우 타임 스탬프를 확인하는 업데이트 sproc을 작성하고이를 사용하여 엔티티를 저장할 수 있습니다.

어떤 옵션을 선택하든 충돌을 관리하려는 방법을 미리 결정해야합니다.

Timestamp-based concurrency control

+1

+1 가장 좋은 방법은 여기에 있습니다. 동시성 검사에 가장 적합한 방법 인 타임 스탬프를 사용해야합니다. 이제는 EF 4.2가 자동으로이를 지원합니다. –

0

나는 당신이 어떤 프로 바이더를 사용하는지 모른다. 어쨌든 Devart와 ODP는 모두 DB Notification을 지원합니다. Devart의 경우 다음 링크를 볼 수 있습니다 OracleDependency Class

관련 문제