반응형
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
반응형
'programing' 카테고리의 다른 글
PowerShell에서 숫자 HTTP 상태 코드를 가져오는 방법 (0) | 2023.08.30 |
---|---|
부트스트랩 모달: 현재 닫기, 새로 열기 (0) | 2023.08.30 |
MySQL - 하위 쿼리를 기반으로 값 업데이트 (0) | 2023.08.30 |
'클릭' 이벤트 시 Ctrl / Shift / Alt 키 확인 (0) | 2023.08.30 |
Powershell을 사용하여 로컬 보안 정책 수정 (0) | 2023.08.30 |