你可以这样做,但我会推荐一种不同的方法。
不要在 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;
}
}