programing

EF: 삭제 시 null 가능한 외부 키가 작동하지 않는 작업 없음

starjava 2023. 8. 30. 21:04
반응형

EF: 삭제 시 null 가능한 외부 키가 작동하지 않는 작업 없음

다음 시나리오:

엔티티 'Material'에 필요한 외부 키를 가진 엔티티 'Material'이 있습니다.유형'. ON DELETE NO ACTION과의 관계를 설정했습니다. 재료에 사용되는 재료 유형을 삭제하려고 하면 mariaDB에서 이 재료 유형이 아직 사용 중이므로 삭제할 수 없다는 내용의 문을 거부합니다.그것은 효과가 있고 예상되는 행동입니다.지금까지는 좋습니다.
재료 도면요소에는 '가법' 도면요소에 대한 선택적 외래 키도 있습니다.이 관계에도 ON DELETE NO ACTION이 있습니다. 이번에 추가 항목을 삭제하려고 하면 mariaDB 데이터베이스가 예상대로 문을 거부합니다.그러나 EF는 재료의 첨가물에 대한 모든 참조를 NULL로 설정하고 최종적으로 첨가물을 삭제합니다.
나는 두 개의 외부 키에서 캐스케이드 삭제를 비활성화했습니다.내가 여기서 뭘 놓쳤지요?아니면 엔티티를 삭제하기 전에 모든 무효 관계를 직접 확인해야 합니까?

다음은 재료:

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

이것이 제 모델입니다.

        Partial Public Class Data
           Inherits DbContext

           Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
              ' Material

               modelBuilder.Entity(Of Material)() _
                   .Map(Sub(tpc)
                         tpc.MapInheritedProperties()
                         tpc.ToTable("Materials")
                     End Sub)
               ' Properties:
               modelBuilder.Entity(Of Material)() _
                   .Property(Function(p) p.AdditiveContent) _
                       .HasColumnType("double")
               modelBuilder.Entity(Of Material)() _
                .Property(Function(p) p.AdditiveId) _
                    .HasColumnType("bigint")
               modelBuilder.Entity(Of Material)() _
                   .Property(Function(p) p.ManufacturerId) _
                    .IsRequired() _
                    .HasColumnType("bigint")
            modelBuilder.Entity(Of Material)() _
                .Property(Function(p) p.MaterialTypeId) _
                    .IsRequired() _
                    .HasColumnType("bigint")
            ' Associations:
            modelBuilder.Entity(Of Material)() _
                .HasMany(Function(p) p.Tasks) _
                    .WithRequired(Function(c) c.Material) _
                .HasForeignKey(Function(p) p.MaterialId) _
                    .WillCascadeOnDelete(False)

            ' Additive

            modelBuilder.Entity(Of Additive)() _
                .Map(Sub(tpc)
                         tpc.MapInheritedProperties()
                         tpc.ToTable("Additives")
                     End Sub)
            ' Association:
            modelBuilder.Entity(Of Additive)() _
                .HasMany(Function(p) p.Materials) _
                    .WithOptional(Function(c) c.Additive) _
                .HasForeignKey(Function(p) p.AdditiveId) _
                    .WillCascadeOnDelete(False)
   End Sub
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

언급URL : https://stackoverflow.com/questions/47475825/ef-on-delete-no-action-on-nullable-foreign-keys-not-working

반응형