Entity framework EF:on delete未对无效外键执行任何操作

Entity framework EF:on delete未对无效外键执行任何操作,entity-framework,mariadb,sql-delete,Entity Framework,Mariadb,Sql Delete,以下场景: 我有一个实体“Material”,它具有实体“MaterialType”所需的外键。我设置了与ON DELETE NO ACTION的关系。 如果我试图删除材料中使用的材料类型,mariaDB将拒绝声明此材料类型仍在使用,因此无法删除。这是可行的,也是预期的行为。到目前为止还不错。 实体材质还具有实体“加法”的可选外键。此关系在删除时也没有任何操作。如果我这次尝试删除一个加法,mariaDB数据库会按预期拒绝该语句。但EF会将材料中对添加剂的所有引用设置为空,并最终删除添加剂。 我禁

以下场景:

我有一个实体“Material”,它具有实体“MaterialType”所需的外键。我设置了与ON DELETE NO ACTION的关系。 如果我试图删除材料中使用的材料类型,mariaDB将拒绝声明此材料类型仍在使用,因此无法删除。这是可行的,也是预期的行为。到目前为止还不错。
实体材质还具有实体“加法”的可选外键。此关系在删除时也没有任何操作。如果我这次尝试删除一个加法,mariaDB数据库会按预期拒绝该语句。但EF会将材料中对添加剂的所有引用设置为空,并最终删除添加剂。
我禁用了两个外键上的级联删除。我错过了什么?或者我真的必须在删除实体之前检查所有可为空的关系吗

这是材料:

Public partial class Material 
       Inherits Entity

        ''' <summary>
        ''' Additive that enhances this material.
        ''' </summary>
        <System.ComponentModel.DisplayName("Verstärkung")> _
        Public Overridable Property AdditiveId() As Global.System.Nullable(Of Long)
            Get
                Return _AdditiveId
            End Get
            Set
                If (Object.Equals(_AdditiveId, value) = false) Then
                  Me.OnAdditiveIdChanging(value)
                  OnPropertyChanging("AdditiveId")
                  _AdditiveId = value
                  Me.OnAdditiveIdChanged()
                  OnPropertyChanged("AdditiveId")
                End If
            End Set
        End Property
        Private _AdditiveId As Global.System.Nullable(Of Long)

        ''' <summary>
        ''' The material type of this material, e.g. PC, PET, etc.
        ''' </summary>
        <System.ComponentModel.DataAnnotations.Required()> _
        <System.ComponentModel.DisplayName("Materialtyp")> _
        Public Overridable Property MaterialTypeId() As Long
            Get
                Return _MaterialTypeId
            End Get
            Set
                If (Object.Equals(_MaterialTypeId, value) = false) Then
                  Me.OnMaterialTypeIdChanging(value)
                  OnPropertyChanging("MaterialTypeId")
                  _MaterialTypeId = value
                  Me.OnMaterialTypeIdChanged()
                  OnPropertyChanged("MaterialTypeId")
                End If
            End Set
        End Property
        Private _MaterialTypeId As Long

        ''' <summary>
        ''' The material type of this material.
        ''' </summary>
        <System.ComponentModel.DisplayName("Materialtyp")> _
        Public Overridable Property MaterialType() As MaterialType

        ''' <summary>
        ''' The additive that enhances this material, if any.
        ''' </summary>
        <System.ComponentModel.DisplayName("Verstärkung")> _
        Public Overridable Property Additive() As Additive
End Class
我是这样删除的:

 If RadMessageBox.Show(String.Format("{0} wirklich löschen?", msg), "Löschen", MessageBoxButtons.YesNo) = DialogResult.Yes Then
        For Each row In e.Rows
            Data.Entry(row.DataBoundItem).State = EntityState.Deleted
        Next
        Try
            Data.SaveChanges()
        Catch ex As Exception
            Util.printError(ex)
            e.Cancel = True
            reload()
        End Try
    End If

不幸的是,这是EF6的陷阱之一。你没有做错什么,但是没有办法让EF做你需要的事情。EF Core在这方面提供了更多的选择,但目前还有其他缺点。不幸的是,这是EF6的陷阱之一。你没有做错什么,但是没有办法让EF做你需要的事情。EF Core在这方面提供了更多的选择,但目前还有其他缺点。
 If RadMessageBox.Show(String.Format("{0} wirklich löschen?", msg), "Löschen", MessageBoxButtons.YesNo) = DialogResult.Yes Then
        For Each row In e.Rows
            Data.Entry(row.DataBoundItem).State = EntityState.Deleted
        Next
        Try
            Data.SaveChanges()
        Catch ex As Exception
            Util.printError(ex)
            e.Cancel = True
            reload()
        End Try
    End If