2012-10-28 3 views
0

내 프로젝트의 감사 추적 시스템이 http://doddleaudit.codeplex.com/에서 있습니다. 이 이미지에서 볼 수 있듯이 그것은 기록하는 EntityTable - 테이블 이름이며, EntityTableKey - 인 기본 키 enter image description here기본 키의 일부인 테이블 이름

내가 있던 테이블로 감사 레코드를 연결하고 싶습니다 그런 다음 linq에서 SQL에 결과를 쿼리하십시오. 그러나 문제는 감사 테이블에 에 대한 레코드가 있고이고 레코드가 인 경우 레코드가 속해있는 기본 키는 알 수 없으므로 테이블 이름을 키의 일부로 사용해야합니다.

그래서 질문입니다. 테이블 이름이 포함 된 복합 기본 키가있는 관계를 만들 수 있습니까?

AuditRecord to Orders 
AuditRecord to Products 
+0

감사 레코드를 두 개의 개별 테이블로 분할하는 것이 좋습니다. 주문 및 기타 제품에 대해 1 – Sami

+0

@Sami - 이런 종류의 시스템이 일반적으로 작동해야하는 것은 아닙니다. 감사 추적은 데이터베이스 테이블에서 기록 후 변경 사항을 표시합니다. db의 각 테이블에 대해 하나의 "메타 테이블"을 만드는 것이 편리하지 않습니다. – OzrenTkalcecKrznaric

+0

조치가 "삭제"된 경우 행이 더 이상 비 감사 테이블에 존재하지 않습니다 ... –

답변

0

당신은 할 수 있지만 조금 다른 접근 방식을 권하고 싶습니다.

PK/FK에서 char/varchars/nvarchar를 사용하지 않으면 인덱스가 압축됩니다. 차라리 모든 테이블의 TableId/TableName 쌍을 보유하는 다른 테이블을 만들 것입니다 (원하는 경우 ID에 sys.tables.object_id를 사용할 수 있음). 그리고 AuditRecords에 FK가 있어야합니다. 그런 다음 AuditRecords와 AuditRecordFields (ID, TableId) 사이에 복합 키를 설정하십시오.

또 다른 한가지 :

  • EntityTable 및 AssociationTable는
  • AuditDate는

EDIT (SQL 서버 2008에서 사용 가능) Date 형이 될 수는 sysname 형식이어야합니다 :

하는 경우 각 객체의 감사 레코드에 액세스하려는 경우 감사 대상 객체의 기본 클래스를 만들고 다음 메소드를 구현할 수 있습니다 (테스트되지 않았으므로주의하십시오).

public IQueryable<AuditRecord> AuditRecords 
{ 
    get 
    { 
     MyContext ctx = new MyContext(); 

     var ars = from ar in ctx.AuditRecords 
        where ar.EntityTable.Equals(this.GetType().Name) 
        select ar; 

     return ars; 
    } 
} 
+0

색인 키는 좋은 생각이지만, 이것이 달성해야하는 목표가 아닙니다. 내가 마지막에 얻고 자하는 것은 예를 들면 다음과 같습니다. product.AuditRecord.Where (a => a.AuditDate jekcom

+0

Linq2Sql을 해킹하는 것을 피하기 위해, 엔티티 테이블과 감사 레코드 (Order.AuditRecordId, Product.AuditRecordId ...) 사이에 FK를 추가 할 수 있지만 마지막 감사 레코드 만 가져옵니다. 그러나 올바르게 기억한다면 partial을 사용하여 각 데이터 클래스를 확장하고 AuditRecord 테이블을 쿼리하고 테이블별로 필터링 된 IQueriable 컬렉션을 반환하는 AuditRecord 속성 (메서드?)을 추가하여 나중에 필터링 할 위치를 수행 할 수 있습니다. ... – OzrenTkalcecKrznaric

관련 문제