0

私のプロジェクトにはhttp://doddleaudit.codeplex.com/からの監査追跡システムがあります。この画像でわかるように、テーブル名であるEntityTableと主キーであるEntityTableKeyを記録します。ここに画像の説明を入力

監査レコードをレコーダーが持っていたテーブルに関連付けてから、linq で結果を sql にクエリしたいと思います。しかし、問題は、監査テーブルに注文のレコードと製品のレコードがある場合、レコードがどこに属しているのか、主キーだけではわからないため、テーブル名をキーの一部として使用する必要があることです。

問題は、テーブル名を含む複合主キーを持つリレーションを作成することは可能かということです。

AuditRecord to Orders
AuditRecord to Products
4

1 に答える 1

0

あなたはそれを行うことができますが、少し異なるアプローチをお勧めします。

PK/FK で char/varchars/nvarchar を使用しないでください。インデックスが肥大化します。すべてのテーブルの TableId/TableName ペアを保持する別のテーブルを作成し (必要に応じて ID に sys.tables.object_id を使用できます)、AuditRecords に FK を設定します。次に、AuditRecords と AuditRecordFields (Id、TableId) の間に複合キーを確立します。

別物:

  • EntityTable と AssociationTable は sysname タイプである必要があります
  • AuditDate は日付型にすることができます (SQL Server 2008 から利用可能)

編集:

各オブジェクトから監査レコードにアクセスしたい場合は、監査対象オブジェクトの基本クラスを作成し、次のメソッドを実装できます (テストされていないことに注意してください)。

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;
    }
}
于 2012-10-28T08:21:22.760 に答える