DELETE语句与REFERENCE约束“FK_EntityAEntityB”冲突

时间:2012-10-31 20:19:07

标签: database entity-framework database-design

我看到了关于这个主题的答案,但不完全是我的答案。

我在设计器中使用EF1创建了一个db模式。 我在两个表( EntityA EntityB )之间添加了一个或零到多个的关系。 接下来,我向表EntityA添加了一条记录,向EntityB添加了一条记录,其ID为EntityA记录。 正如我在设计模式(在MS SMS中)中看到的那样,字段EntityA_id(在表EntityB中)被设置为ALLOW NULL, 我试图删除表EntityA中的记录。

我预计该记录将被删除,表EntityB中的字段EntityA_id将自动设置为NULL。 不幸的是我得到了异常: DELETE语句与REFERENCE约束“FK_EntityAEntityB”冲突

如果带有外键的字段设置为ALLOW NULL,为什么会抛出异常?

1 个答案:

答案 0 :(得分:0)

  

如果带有外键的字段设置为ALLOW NULL,为什么会抛出异常?

抛出异常的原因是您尝试执行的操作会影响整行,而不仅仅是可以为空的列。在子表中设置列以允许null规定允许该列没有值。除非RDBMS明确规定,否则可空列与外键等参照完整性约束无关;这意味着无论是否已设置任何列特定规则,外键规则仍将启动。并且外键规则规定如果父行在子表中具有子行,则不能删除父行。这样做会渲染所有子记录孤儿。我们现在不希望任何人成为孤儿吗?

外键保证的是,在子表中没有在父表的键列中引用有效值的情况下,不会在外键列中插入/删除任何值,如下所示相反,没有父行可以删除(除非已指定ON DELETE子句),如果相关表中有任何子行。

rules of null foreign key columns in MSSQL(我假设您正在使用)声明允许外键列包含空值。这就是你可能需要做的就是把它拉下来。将列值设置为NULL,然后尝试删除。

与此无关,您可能对this

感兴趣