0

我的项目中有一个来自http://doddleaudit.codeplex.com/的审计跟踪系统。正如您在此图像上看到的,它记录了EntityTable - 这是表名和EntityTableKey - 这是主键在此处输入图像描述

我想将审计记录与它有记录器的表相关联,然后在 linq to sql 中查询结果。但问题是,如果审计表有订单记录和产品记录,它永远不会只通过主键知道记录属于哪里,因此我需要使用表名作为键的一部分。

所以问题是:是否有可能创建一个具有包含表名的复合主键的关系?

AuditRecord to Orders
AuditRecord to Products
4

1 回答 1

0

你可以这样做,但我会推荐一种不同的方法。

不要在 PK/FK 中使用 char/varchars/nvarchar,它会使索引膨胀。我宁愿创建另一个表来保存所有表的 TableId/TableName 对(如果你愿意,你可以使用 sys.tables.object_id 作为你的 id)并在 AuditRecords 中有一个 FK。然后在 AuditRecords 和 AuditRecordFields (Id, TableId) 之间建立复合键。

另一件事:

  • EntityTable 和 AssociationTable 应该是 sysname 类型
  • AuditDate 可以是 Date 类型(可从 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 回答