即使使用外键约束仍然删除引用的对象(无操作)

时间:2013-10-10 19:32:40

标签: c# entity-framework entity-framework-5 constraints

我首先使用实体​​框架5模型。

我的模型中有一些实体,其中大多数都与删除和更新的“无操作”外键约束有一对多的关系。

但是我仍然能够删除没有错误的父子对象(在EF4上,我曾经得到一个异常警告,我不能删除一个对象,因为还有另一个引用它)

首先由EF5模型生成的部分代码:

...
... Create all tables...
...
... Create all foreign key constraints ... 
...
-- Creating foreign key on [TEstTela_ID] in table 'TEstPermissao'
ALTER TABLE [dbo].[TEstPermissao]
ADD CONSTRAINT [FK_TEstTelaTEstPermissao]
FOREIGN KEY ([TEstTela_ID])
REFERENCES [dbo].[TEstTela]
    ([ID])
ON DELETE NO ACTION ON UPDATE NO ACTION;
....

删除对象代码:

...
EstContextDB CurrentContext = new EstContextDB();  // inherits from DbContext

CurrentContext.Set<TEstTela>().Remove(currentTEstTelaEntity);
CurrentContext.SaveChanges();  /* Exception should be thrown here
 because at least one TEstPermissao object references this
 currentTEstTelaEntity but it still delete the object without
 errors or exceptions, and plus the TEstPermissao object
that references this currentTEstTelaEntity gets its reference as 'null' */

1 个答案:

答案 0 :(得分:1)

问题与级联删除无关。您尝试删除父TEstTelaEntity并且EF将外键从子TEstPermissao设置为此父TEstTelaEntitynull(显然该关系是可选的)然后发送子级的UPDATE语句和数据库父级的DELETE语句。如果级联删除会启动,则子项也将被删除,而不仅是父项。结果是一致且有效的:您现在只在数据库中有一个TEstPermissao实体,而不引用TEstTelaEntity

仅在加载子项并在删除父项时附加到上下文的情况下,外键才设置为null。否则你确实会得到关于你期望的约束违规的例外。 (我相信附加与分离的孩子之间的差异在EF 4和EF 5中是相同的。)

如果您确实不想删除父级,只要它有任何子级,请检查父级是否有子级的相应代码,以便决定是否应该调用Remove