문제

엔티티 프레임 워크와 함께 감사 고리를보고 있습니다. 그들 중 많은 사람들이 오래된/새로운 가치 비교를 보여줍니다. 이것은 감사 트레일에 적합하지만 스냅 샷 객체를 찾고 있습니다.

예를 들어 ... 제품을 관리하는 응용 프로그램이 있다고 가정 해 봅시다. 제품에는 여러 속성과 관련 다른 개체가 있습니다. 객체를 10 번 변경한다고 가정 해 봅시다. 또한 해당 객체 변경의 화면을 볼 수 있다는 것이 중요하다고 가정 해 봅시다 (감사 트레일이 아니라 화면이 실제로 읽기 전용 형식으로 보이는 것). 내가 관심있는 것은 10 가지 변경 사항에 대한 원래 EF 제품 객체 (모든 관련 데이터 포함)를 검색하고 (보고 싶은지) 화면에 바인딩하는 데 사용하는 것입니다.

SQL Server를 사용하는 경우 요즘 직렬화 된 객체 (XML, Blob 등)에 어떤 유형을 사용해야합니까? 이것을하는 것이 합리적입니까?

도움이 되었습니까?

해결책

보자. 객체 그래프를 가져 와서 나중에 구체화 할 수있는 형식으로 데이터베이스로 직렬화해야합니다. 나는 이것을 정확하게하는 도구가 있다고 생각합니다. 그들 중 하나는 나를 놀라게합니다. 엔티티 프레임 워크입니다.

당신이하고 싶은 것은 매우 일반적인 것입니다. 위키 엔진을 고려하십시오. Wiki는 모든 사람이 보는 팁 개정판과 모든 문서의 수정을 받아야합니다. Wiki는 또한 팁 개정판이 표시되는 것과 같은 방식으로 백 개정을 표시 할 수 있어야합니다. 따라서 동일한 스토리지 형식을 둘 다 사용해야합니다.

모든 엔티티 유형을 버전으로 만들도록 제안합니다. 엔티티 유형을 편집하면 팁 개정판을 편집하고 이전 값이 포함 된 후면 개정을 저장합니다. (새 팁을 삽입하는 대신 팁 개정을 편집 한 이유는 현재 ObjectContext로 구체화되지 않은 다른 개체가 링크가 아닌 링크로 보존하려는 팁에 대한 링크를 포함 할 수 있기 때문입니다. 등 수정.)

필요한 경우 SQL Server 테이블을 분할하여 백 수정 사항이 다른 파일 그룹에 저장되도록 할 수 있습니다. 이를 통해 팁 개정판과 개별 개정을 별도로 백업 할 수 있습니다.

다른 팁

먼저 테이블에 속성 세트를 추가해야합니다.

  • 버전 - 마지막 수정 시간 (시간 대신 자동화 카운터 일 수도 있음).
  • LastModifiedBy- 마지막 수정을 한 사용자에 대한 참조 (저장하는 경우).

그런 다음 버전 기록을 저장하는 방법에 대한 몇 가지 옵션이 있습니다. 당신은 할 수 있습니다

  1. 역사를 저장하려는 각 메인 테이블에 대한 새 테이블을 만듭니다. 이 히스토리 테이블은 메인 테이블과 동일한 필드를 모두 갖지만 기본 및 외국 키는 시행되지 않습니다. 각 외국 키마다 시간에 참조 된 항목의 저장 버전이 생성되었습니다.

  2. 또는 엔티티에 대한 흥미로운 모든 것을 직렬화하고 하나의 글로벌 역사 테이블에 버전을 원하는 모든 엔티티에 대한 직렬화 된 블로브를 모두 저장할 수 있습니다 (개인적으로 첫 번째 접근 방식).

역사 테이블을 어떻게 채우나요? 업데이트 및 삭제 트리거를 통해.

  • 엔티티의 업데이트 트리거 - 모든 이전 값을 기록 테이블에 복사하십시오. 각 외국 키에 대해 - 현재 버전의 참조 엔티티를 복사하십시오.
  • 삭제 트리거에서 - 기본적으로 동일하게 수행합니다.

점점 더 현대적인 시스템은 실제로 아무것도 삭제하지 않습니다. 그들은 그냥 표시 삭제 된 것들. 이 패턴을 따르고 싶다면 (몇 가지 이점이 있음) - isdeleted 깃발을 엔티티에 추가하는 대신 (물론 모든 곳에서 삭제 된 엔티티를 필터링해야 함).

당신은 당신의 역사를 어떻게 보십니까? 메인 테이블과 동일한 속성을 가지고 있으므로 히스토리 테이블 만 사용하십시오. 문제가되지 않아야합니다. 그러나 - 외국 키를 확장 할 때 - 참조 된 엔티티 버전이 역사 테이블에 저장하는 것과 동일하도록하십시오. 그렇지 않은 경우 - 참조 된 엔티티의 역사 테이블로 이동하여 그곳에서 값을 가져와야합니다. 이런 식으로 당신은 항상 모든 참조를 포함하여 엔티티가 그 순간에 어떻게 보이는지에 대한 스냅 샷을 가질 것입니다.

위의 모든 것 외에도 엔티티의 상태를 이전 버전으로 복원 할 수도 있습니다.

이 구현은 쉽지만 공간을 소비 할 수 있습니다. 스냅 사진, 변화가 이루어진 것이 아니라. 변경 사항 만 저장하려면 업데이트 트리거에서 변경된 필드를 감지하고 직렬화하고 글로벌 역사 테이블에 저장할 수 있습니다. 이렇게하면 최소한 사용자 인터페이스에 변경된 내용과 누가 누구 (이전 버전으로 되돌아가는 데 어려움이있을 수 있지만).

내가 최근에 만든 프로젝트에서 우리가 사용했던 우리는 SaveChanges 방법의 메소드 DbContext 수업. 이것은 우리에게 인스턴스에 대한 액세스를 제공했습니다 ChangeTracker 수업. 부름 ChangeTracker.Entries() 목록에 액세스 할 수 있습니다 DbEntityEntry. DbEntityEntry 다음과 같은 흥미로운 속성과 방법이 있습니다.

  • State - 객체가 새로 생성, 수정 또는 삭제 중입니까?
  • Entity - 개체의 사본이 서있는대로
  • CurrentValues - 편집 된 가치의 열거
  • OriginalValues - 원래 값의 열거

우리는 변경 세트와 변경 사항을위한 POCO 세트를 만들어 EF를 통해 액세스 할 수있었습니다. 이를 통해 사용자는 날짜 및 책임있는 사용자와 함께 현장 레벨 변경을 볼 수있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top