![](/img/trans.png)
[英]Entity Framework Core code first - 0..1 to many relationship and cascade delete
[英]Entity Framework Core cascade delete one to many relationship
public class Station : IEntitie
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual ICollection<RegulatorySchedule> RegulatoryScheduleDispatchStations { get; set; }
public virtual ICollection<RegulatorySchedule> RegulatoryScheduleDestinationStations { get; set; }
}
public class RegulatorySchedule : IEntitie
{
[Key]
public int Id { get; set; }
public virtual Station DispatchStation { get; set; }
public virtual Station DestinationStation { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<RegulatorySchedule>()
.HasOne(s => s.DestinationStation)
.WithMany(s => s.RegulatoryScheduleDestinationStations)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
modelBuilder.Entity<RegulatorySchedule>()
.HasOne(s => s.DispatchStation)
.WithMany(s => s.RegulatoryScheduleDispatchStations)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
}
僅當我明確刪除刪除Restrict OnDelete (Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict)
的行為時,才在遷移期間創建數據庫。 否則,將引發異常:
“在表'RegulatorySchedules'上引入FOREIGN KEY約束'FK_RegulatorySchedules_Stations_DispatchStationId'可能會導致循環或多個級聯路徑。請指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。”
我需要刪除表的Station Station以及與表相關的屬性RegulatorySchedules DispatchStation和DestinationStation暴露為NULL。 但是限制選項在刪除不能放的SetNull時會有例外。 告訴我怎么做?
描述的“問題”與實體框架無關-這是MS SQL Server本身的限制。 具有多個FK的表可能只有其中一個具有級聯刪除功能。
因此,只要您需要兩個FK都具有級聯 ,就應該在代碼中實現這種“清理”。 將一個(或兩個)FK設置為DeleteBehavior.Restrict
,然后在控制器/服務中,在刪除Station
之前手動查找並刪除所有相關的RegulatorySchedule
德米特里的答案很完美。 對於任何未來的旅行者,下面提供映射表的工作示例。
該代碼位於DbContext
類的OnModelCreating(ModelBuilder modelBuilder)
方法中:
modelBuilder.Entity<AB>()
.HasKey(e => new { e.AId, e.BId});
modelBuilder.Entity<AB>()
.HasOne(e => e.A)
.WithMany(e => e.ABs)
.HasForeignKey(e => e.AId)
.OnDelete(DeleteBehavior.Cascade); // <= This entity has cascading behaviour on deletion
modelBuilder.Entity<AB>()
.HasOne(e => e.B)
.WithMany(e => e.ABs)
.HasForeignKey(e => e.BId)
.OnDelete(DeleteBehavior.Restrict); // <= This entity has restricted behaviour on deletion
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.