在EntityFramework中使用Independent Association实现“Common”外键

时间:2014-02-21 18:20:03

标签: c# entity-framework

我在我的项目中使用EntityFramework 6,它使用AuditLog表来跟踪多个其他表中的更改(简单地说,我将它们命名为T1,T2,... T5,没有详细信息)。 AuditLog表中的每条记录都用于另一个表(T1,... T5)。所以它是[0..1]到很多关系。

我不想使用基于标准FK约束的关联,因为它会在AuditLog表中引入5个FK,并且每个记录中5个FK列中的4个为空。我想在AuditLog表中使用“common”列作为其他表的“公共”FK,此FK列中的值可以是来自5个表之一的主键。因此,为AuditLog表生成以下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)的新对象时,由于FK约束,EF将抛出以下异常:

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

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

有没有办法可以使用独立关联,还可以在AuditLog中的entityId中维护其他表的主键?

1 个答案:

答案 0 :(得分:1)

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

您没有在审核日志中说明您想要实现的目标,但是为实体框架实体添加自动审核日志有很多努力 - 这些更简单,因为您不必显式添加它们,但可能无法满足您的所有要求。其中一些包括:

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

找到了许多博客文章