2014-02-21 25 views
1

我在我的项目中使用EntityFramework 6,该项目使用AuditLog表跟踪多个其他表中的更改(简单地说,我将它们命名为T1,T2 ,. T5没有这个细节)。 AuditLog表中的每个记录都用于其他表(T1,... T5)中的一个。所以这对于很多关系来说是[0..1]。在EntityFramework中使用独立协会实现“通用”外键

我不想使用基于标准FK约束的关联,因为它会在AuditLog表中引入5个FK,并且每个记录的5个FK列中有4个为空。我想使用AuditLog表中的“公共”列作为其他表的“公共”FK,此FK列中的值可以是5个表中的一个的主键。其结果是,对于审计日志表生成以下SQL:

CONSTRAINT [FK_AuditLogT1] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[T1] ([Id]), 
CONSTRAINT [FK_AuditLogT2] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[T2] ([Id]), 
CONSTRAINT [FK_AuditLogT3] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[T3] ([Id]), 
CONSTRAINT [FK_AuditLogT4] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[T4] ([Id]), 
CONSTRAINT [FK_AuditLogT5] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[T5] ([Id]) 

在运行时,当应用程序被添加类型T1(或T2 ... T5)的新对象,将EF将抛出由于以下异常到FK约束:

异常:INSERT语句与FOREIGN KEY约束“FK_AuditT2”冲突。冲突发生在数据库“xxxx”, 表“dbo.T2”,列'Id'。

我试图使用独立关联来映射AuditLog和其他表之间的关系,但没有例外,但EF不会自动填充AuditLog表中的entityId列与其他表的主键。

有没有办法我可以使用独立的关联,但也维护审核日志entityId中的其他表的主键?

回答

1

你不能在Entity Framework关联中这样做 - 这是一个数据库限制 - 一个字段不能处于多个关系中,因为约束会冲突(例如,T1具有关键字10,但这不在T2中,因此约束你的“Key”字段将被打破

你没有说你想在你的审计日志中实现什么,但是有很多努力为Entity Framework实体添加自动审计日志 - 这些将会更简单一些,因为你不需要明确地添加它们,但可能并不能满足你所​​有的要求,其中包括:

加上通过搜索实体框架审核日志

+0

你是对发现的一些博客文章。我原来的想法是行不通的。在阅读您在EF Audit上建议的帖子后,我放弃了FK关联,并覆盖SaveChanges()以管理“EntityId”的值。感谢您的建议。 – user3333649