C# 使用IDbCommandTreeInterceptor的SoftDelete模式不';禁用“级联删除”时无法工作

C# 使用IDbCommandTreeInterceptor的SoftDelete模式不';禁用“级联删除”时无法工作,c#,entity-framework,C#,Entity Framework,我按照示例启用了应用程序上的一些实体来使用SoftDelete模式 但是,这在以下情况下不起作用(): 级联删除已禁用(请参阅) 将相关子记录加载到标识表中时(如) 在本例中,显然触发要设置的UPDATE语句(Status=1)不会导致任何问题。但是,看起来EF在触发实际SQL语句之前正在进行某种FK检查 它在不触发更新的情况下抛出以下内容: 操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当 对关系进行更改时,相关的外键属性为 设置为空值。如果外键不支持空值, 必须定义新关系,外键属

我按照示例启用了应用程序上的一些实体来使用SoftDelete模式

但是,这在以下情况下不起作用():

  • 级联删除已禁用(请参阅)
  • 将相关子记录加载到标识表中时(如)
  • 在本例中,显然触发要设置的
    UPDATE
    语句(
    Status=1
    )不会导致任何问题。但是,看起来EF在触发实际SQL语句之前正在进行某种FK检查

    它在不触发更新的情况下抛出以下内容:

    操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当 对关系进行更改时,相关的外键属性为 设置为空值。如果外键不支持空值, 必须定义新关系,外键属性必须为 指定了另一个非空值,或者必须为不相关的对象 删除


    有办法解决这个问题吗?

    将Room.HouseId属性类型更改为Nullable应该是一个解决办法,但最终会导致没有房间的软删除房屋。。。还有孤儿室。。。为了防止出现这种情况,我想您必须截获UPDATE语句,将Room.HouseId设置为null,并防止更改该值。从来没有试过。。。然而…@jbl,我同意这会起作用,但这意味着我必须更改数据库,而我目前无法更改。添加额外拦截器的问题在于,EF实际上在拦截器代码触发之前触发了自己的验证(以检查
    ConceptualNull
    )。我需要一种方法来告诉它绕过这些检查。将Room.HouseId属性类型更改为Nullable应该是一种解决方法,但最终将导致没有房间的软删除房屋。。。还有孤儿室。。。为了防止出现这种情况,我想您必须截获UPDATE语句,将Room.HouseId设置为null,并防止更改该值。从来没有试过。。。然而…@jbl,我同意这会起作用,但这意味着我必须更改数据库,而我目前无法更改。添加额外拦截器的问题在于,EF实际上在拦截器代码触发之前触发了自己的验证(以检查
    ConceptualNull
    )。我需要一个方法告诉它绕过那些检查。