0

我首先使用实体​​框架 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' */
4

1 回答 1

1

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

null仅当您删除父项时子项已加载并附加到上下文时,才会设置外键。否则,您确实会得到有关您期望的约束违规的异常。(我相信在 EF 4 和 EF 5 中,依恋儿童与分离儿童之间的差异是相同的。)

如果您真的不想删除只要有孩子的父母,请使用适当的代码检查父母是否有孩子,以确定是否Remove应该调用。

于 2013-10-10T21:34:45.010 回答