我的项目http://doddleaudit.codeplex.com/中有一个审计跟踪系统。 正如您在此图片上看到的,它会记录 EntityTable - 表名, EntityTableKey - 这是主键
我想将审计记录与它具有记录器的表相关联,然后将linq中的结果查询到sql。但问题是,如果审计表有订单的记录并记录产品,它将永远不会只知道主键,记录属于哪里,因此我需要使用表名作为键的一部分。
所以问题是:是否可以创建一个具有包含表名的复合主键的关系?
AuditRecord to Orders
AuditRecord to Products
答案 0 :(得分:0)
你可以这样做,但我会建议采用一种不同的方法。
不要在PK / FK中使用char / varchars / nvarchar,它会使索引膨胀。我宁愿创建另一个表,它将保存所有表的TableId / TableName对(如果你愿意,你可以使用sys.tables.object_id作为你的id)并在AuditRecords中有一个FK。然后在AuditRecords和AuditRecordFields之间建立复合密钥(Id,TableId)。
另一件事:
编辑:
如果您想从每个对象访问审计记录,您可以为审计对象创建基类并实现以下方法(注意,它未经测试):
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;
}
}