表名作为主键的一部分

时间:2012-10-28 07:32:19

标签: c# sql-server linq-to-sql composite-primary-key

我的项目http://doddleaudit.codeplex.com/中有一个审计跟踪系统。 正如您在此图片上看到的,它会记录 EntityTable - 表名, EntityTableKey - 这是主键enter image description here

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

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

AuditRecord to Orders
AuditRecord to Products

1 个答案:

答案 0 :(得分:0)

你可以这样做,但我会建议采用一种不同的方法。

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

另一件事:

  • EntityTable和AssociationTable应为sysname type
  • 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;
    }
}