C# 即使有外键约束,仍在删除参照对象(无操作)

C# 即使有外键约束,仍在删除参照对象(无操作),c#,entity-framework,entity-framework-5,constraints,C#,Entity Framework,Entity Framework 5,Constraints,我首先使用实体框架5模型 我的模型中有一些实体,其中大多数实体具有一对多关系,在删除和更新时具有“无操作”外键约束 但是我仍然能够删除父对象和子对象,没有错误(在EF4上,我曾经得到一个异常警告,我不能删除一个对象,因为有另一个对象引用它) EF5模型首先生成的部分代码: ... ... Create all tables... ... ... Create all foreign key constraints ... ... -- Creating foreign key on [TEst

我首先使用实体框架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' */
。。。
EstContextDB CurrentContext=新建EstContextDB();//从DbContext继承
CurrentContext.Set().Remove(currentTEstTelaEntity);
CurrentContext.SaveChanges();/*这里应该抛出异常
因为至少有一个TEstPermissao对象引用此
currentTEstTelaEntity,但它仍然删除对象而不删除
错误或异常,以及TEstPermissao对象
引用此currentTEstTelaEntity的将其引用获取为“null”*/

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

只有在删除父项时加载子项并将其附加到上下文的情况下,才会将外键设置为
null
。否则,您确实会得到关于预期的约束冲突的异常。(我相信在EF 4和EF 5中,依附儿童和分离儿童之间的差异是相同的。)


如果你真的不想删除一个父项,只要它有子项,就用适当的代码检查该父项是否有子项,以决定是否应该调用
Remove

使用
Fluent API
来设置级联删除:()@EF5上的Tico我需要在Fluent API的代码上指定我不会自动级联删除的代码?即使是模型优先?我只会先使用代码,所以我不是理想的源代码。但是,即使在代码优先的情况下,我也总是同时设置DataAnnotation和Fluent API(如果适用)。由于您的
SQL
不起作用,请尝试
Fluent API
您不能先对模型使用Fluent API。那么如何先对模型禁用OneToManyCascadeDeleteConvention和ManyToManyCascadeDeleteConvention?确定!谢谢,我发现了问题。。。这是因为我将0..1设置为多,而不是1对多关系