【问题标题】:Implement a "Common" foreign key with Independent Association in EntityFramework在 EntityFramework 中实现具有独立关联的“通用”外键
【发布时间】:2014-02-21 18:20:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您不能对实体框架关联执行此操作 - 这是一个数据库限制 - 一个字段不能处于多个关系中,因为约束会发生冲突(例如 T1 有键 10,但 T2 中不存在,因此约束您的“关键”字段将被破坏。

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

    加上一些通过搜索实体框架审计日志找到的博文

    【讨论】:

    • 你是对的。我原来的想法是行不通的。在阅读了您在 EF Audit 上建议的帖子后,我放弃了 FK 关联,并覆盖 SaveChanges() 来管理“EntityId”的值。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多