我首先使用实体框架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' */
答案 0 :(得分:1)
问题与级联删除无关。您尝试删除父TEstTelaEntity
并且EF将外键从子TEstPermissao
设置为此父TEstTelaEntity
到null
(显然该关系是可选的)然后发送子级的UPDATE语句和数据库父级的DELETE语句。如果级联删除会启动,则子项也将被删除,而不仅是父项。结果是一致且有效的:您现在只在数据库中有一个TEstPermissao
实体,而不引用TEstTelaEntity
。
仅在加载子项并在删除父项时附加到上下文的情况下,外键才设置为null
。否则你确实会得到关于你期望的约束违规的例外。 (我相信附加与分离的孩子之间的差异在EF 4和EF 5中是相同的。)
如果您确实不想删除父级,只要它有任何子级,请检查父级是否有子级的相应代码,以便决定是否应该调用Remove
。