为什么在删除某些实体实例时会抛出InvalidOperationException,而为其他实体抛出UpdateException

时间:2011-04-16 17:26:32

标签: entity-framework-4

我为两个实体定义了一对多的关系,我们只说客户和订单。该关系表明Customer对象可以有许多Order对象,但Order必须有一个Customer ...一个非常标准的1:M关系。

我没有在数据库上配置级联规则,并且在我的实体数据模型中OnDeletes设置为None。这意味着删除不允许订单的客户。

我的问题是,当我的应用程序中的用户删除一个客户(可能有订单)时,我想捕获通过强制执行外键约束而引发的异常。对于一个有33个订单的特定客户,我得到InvalidOperationException但是对于只有2个订单的另一个客户,我得到了UpdateException。 EF让第二个delete语句进入数据库,数据库返回EF为其发出UpdateException的错误。在第一个场景中,EF甚至不让delete语句进入数据库,它只是说这将是无效的,因为Customer的实体实例包含Orders。

有人可以解释为什么会发生这种情况吗?

1 个答案:

答案 0 :(得分:2)

可能有两个不同的例外,因为有两个层应用此检查。首先,如果您将对象标记为已删除并执行SaveChanges,EF将检查其内部存储,其中跟踪所有加载的对象。如果EF发现任何与已删除客户相关的跟踪订单也未标记为已删除,则会触发异常(可能是InvalidOperationException)。如果没有跟踪的相关订单,EF将在数据库中执行删除操作,其中FK关系触发错误。 EF捕获此错误,并且异常是throwm(可能UpdateException与内部数据库相关的异常)。