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