我为两个实体定义了一对多的关系,我们只说客户和订单。该关系表明Customer对象可以有许多Order对象,但Order必须有一个Customer ...一个非常标准的1:M关系。
我没有在数据库上配置级联规则,并且在我的实体数据模型中OnDeletes设置为None。这意味着删除不允许订单的客户。
我的问题是,当我的应用程序中的用户删除一个客户(可能有订单)时,我想捕获通过强制执行外键约束而引发的异常。对于一个有33个订单的特定客户,我得到InvalidOperationException但是对于只有2个订单的另一个客户,我得到了UpdateException。 EF让第二个delete语句进入数据库,数据库返回EF为其发出UpdateException的错误。在第一个场景中,EF甚至不让delete语句进入数据库,它只是说这将是无效的,因为Customer的实体实例包含Orders。
有人可以解释为什么会发生这种情况吗?
答案 0 :(得分:2)
可能有两个不同的例外,因为有两个层应用此检查。首先,如果您将对象标记为已删除并执行SaveChanges
,EF将检查其内部存储,其中跟踪所有加载的对象。如果EF发现任何与已删除客户相关的跟踪订单也未标记为已删除,则会触发异常(可能是InvalidOperationException
)。如果没有跟踪的相关订单,EF将在数据库中执行删除操作,其中FK关系触发错误。 EF捕获此错误,并且异常是throwm(可能UpdateException
与内部数据库相关的异常)。