エンティティフレームワークコアカスケード削除1対多関係

c# entity-framework entity-framework-core

質問

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)削除するときの動作をはっきりと明らかにした場合にのみ、移行中にデータベースが作成されます。それ以外の場合は、例外がスローされます。

"RegularSchedules"テーブルにFOREIGN KEY制約 'FK_RegulatorySchedules_Stations_DispatchStationId'を導入すると、サイクルまたは複数のカスケードパスが発生する可能性があります。「アクションの削除」または「アクションの更新」を指定するか、他のFOREIGN KEY制約を変更してください。

私は、テーブルのステーションステーションとテーブル関連のプロパティRegulatorySchedules DispatchStationとDestinationStationがNULLにさらされている状態を取り除く必要があります。しかしRestrictオプションは、私が置くことができないSetNullを削除するときに例外があります。どのようにするか教えてください。

受け入れられた回答

「問題」はEntity Frameworkに関連していないと記述されています。これはMS SQL Server自体の制限です。いくつかのFKを持つテーブルは、それらのうちの1つだけカスケード削除を持つことがあります。

したがって、両方のFKにカスケードが必要になるとすぐに、コード内にそのような「クリーンアップ」を実装する必要があります。 Stationを削除する前に、1つ(または両方)のFKをDeleteBehavior.Restrictに設定し、コントローラ/サービスで、関連するすべての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


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ