2014-10-17 1 views
0

이전 응용 프로그램에서는 Paul Van Bladel's 접근 방식을 사용하여 감사 내역을 성공적으로 설정했습니다. 그의 접근 방식은 완벽하게 작동했으며 지극히 쉽게 따라 할 수있었습니다. 그러나 그는 감사 된 레코드를 저장하기 위해 단일 테이블만을 사용하고 있습니다. 내가 비슷한 테이블에 대한 감사 테이블을 각각 약 7-8 테이블에 대한 감사해야합니다 제외하고 뭔가를해야합니다. 일반 테이블 객체를 전달하는 방법을 알아낼 수만 있다면 Paul Van Bladel의 솔루션을 다시 사용할 수 있습니다. 다른 사람들이 온라인으로 참조 할 수있는 다른 예를 알고 있습니까? 또는 여러 테이블에 대한 후행 감사를 올바르게 구현하는 방법에 대한 제안.여러 테이블을 사용하여 감사 내역 구현

p.s 예를 들어 Beth Massi's을 사용해 보았지만 VS2012 Lightswitch에서 사용하지 않기로 한 것 같습니다.

답변

0

귀하의 질문은 광범위하고 잠재적으로 너무 광범위합니다. 내가 수집하는 것에서는 여러 개의 테이블이 있지만 서로 다른 열이있을 가능성이 큽니다. 너무 많은 코드를 재현하지 않고 단순히 컬럼을 기반으로 적절한 컨텐츠를 작성하는 일반적인 접근 방식을 찾고 있습니다.

당신과해야 할 수 있습니다 무엇 :

  • 그 테이블을 작성합니다.
  • 감사해야하는 내용을 결정하십시오.
  • 이러한 테이블을 너무 서로 비교하십시오.

종종 콘텐츠를 추상화해야하는 정도를 결정하는 데 도움이됩니다. 이 특정 예제는 의 제어 반전에서 유용 할 수 있습니다. 또는 종속성 주입. 이 방법을 사용하면 특정 감사 대상을 특정 클래스에 주입 할 수 있습니다.

public interface IAudit<T> 
{ 
    void WriteToAudit(<T> model); 
} 

그래서이 특정 인터페이스는 감사 데이터 모델을 표현해야 일반, 구현합니다. 유연성을 제공하는 동시에 몇 가지 차별화 된 모델을 제공하여 요구 사항을 개선 할 수 있습니다.

이제 인터페이스를 상속 한 구현 클래스를 작성해야합니다. 이제

public class Inventory : IAudit<InventoryModel> 
{ 
    public void WriteToAudit(InventoryModel model) 
    { 
      // Write your database content, then pass *Properties* from the model. 
      // Which will write for this particular table. 
    } 
} 

이 방법의 강력한 부분 :

  • 생성자
  • : 그래서 지금 당신은 본질적으로 새로운 IAudit을 만들 수

    public class Stuff 
    { 
        private IAudit audit; 
        public void DoSomething(model) 
        { 
          audit.WriteToAudit(model); 
        } 
    } 
    

    는, 당신은 통과 할 수있는 몇 가지 방법을 통해서이다

  • 방법

이것은 엄청나게 거친 구현이며 여러 가지 오타가있을 수 있습니다. 이것은 빠른 게시물 이었지만 잘하면이 방향으로 당신을 가리 킵니다. 이 문제에 대한 자세한 내용은 here을 참조하십시오.

+0

나는 이것을 Lightswitch와 통합하는 데 문제가 있음을 인정해야합니다. 인터페이스 및 제네릭에 대한 내 경험이 부족합니다. Lightswitch에서 이것을 어떻게 사용할 수 있는지에 대한 지침이 있습니까? – HiTech

+0

전 라이트 스위치를 사용한 적이 없습니다. – Greg

0

고려할 수있는 한 가지 옵션은 외부 감사 테이블의 대안으로 행 버전을 제공하기 위해 테이블 ​​구조를 업데이트하는 것입니다.이 패턴은 전체 감사 추적 및 데이터 계보 분석을 수행 할 수있는 기능이 필요한 경우 매우 유용합니다. 이 기능의 또 다른 이점은 특정 시점에 주어진 레코드의 상태를 조사 할 수 있다는 것입니다. 팩트 테이블을 생성하거나 천천히 변화하는 차원에서 상태를 유지하는 데 매우 유용합니다. 이를 위해 선호하는 방법은 SCD 유형 2 패턴의 선을 따라 무언가를 사용하는 것입니다. (일반적인 아이디어는 here을 참조하십시오.)

이 패턴을 구현하는 각 테이블에 대해 활성 레코드 (예 : DateTo IS NULL 필터) 만 반환하도록 기본 쿼리를 수정하십시오. 그런 다음 다음과 같이 당신이해야 할 모든 삭제 및 업데이트에 대한 표준 CRUD 이벤트 절편 : Table_Updating() :

  1. 복사 새 로컬 엔티티 기록 객체에 업데이트 된 엔티티 (모든 변경 사항 포함) . (예 : Order 개체) ToDate 필드가 null이고 FromDate가 DateTime.Now인지 확인하십시오.
  2. Add 메서드를 사용하여 Entity 컬렉션에 로컬 엔터티를 추가합니다 (예 : Orders.Add()를 사용하여 Orders 컬렉션에 새 Order 개체 추가
  3. 엔티티 레코드의 기존 복사본을 가져옵니다 (즉, ToDate가 NULL 인 대상 OrderID와 일치하는 Order 개체를 가져옵니다)
  4. 엔티티 레코드의 기존 복사본을 업데이트하고 ToDate를 DateTime으로 설정합니다
  5. 변경 사항을 커밋 부탁해

Table_Deleting() :

  1. 업데이트 DateTime.Now 대신 NULL
  2. 에 목표 기록에 TODATE
  3. 변경 사항을 커밋 변경 실체
  4. 을의 컬렉션에서 개체를 제거

Table_Inserting() :

  1. DateFrom 필드가 DateTime.Now로 설정되어 있고 DateTo 필드가 NULL인지 확인하십시오.
  2. 변경 사항을 적용하십시오.

그게 전부입니다.

관련 문제