複数のカスケードパスエラー - Entity Frameworkコア

asp.net-core c# entity-framework-core

質問

Entity Framework Coreを使用して新しいデータベースをセットアップしようとしていますが、「Update-Database」というコマンドを呼び出すときにエラーが発生します。

"Introducing FOREIGN KEY constraint 'FK_Answers_Users_UserId' on table 'Answers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints."

私は実際にデータベースから何かを削除する計画はありませんが、ユーザーが削除された場合、それはユーザーに関連するすべてのものを削除するように設定しても問題ありません。

ここに私のモデルです:

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Username { get; set; }
    public string ImageUrl { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
    public int AnswersFlagged { get; set; }
    public bool Status { get; set; }

    public IEnumerable<Dispute> Disputes { get; set; }
    public IEnumerable<Answer> Answers { get; set; }
}

public class Dispute
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public int CategoryId { get; set; }
    public string Text { get; set; }
    public string OptionOneText { get; set; }
    public string OptionTwoText { get; set; }
    public string OptionThreeText { get; set; }
    public string OptionOneImageUrl { get; set; }
    public string OptionTwoImageUrl { get; set; }
    public string OptionThreeImageUrl { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
    public bool Status { get; set; }

    public User User { get; set; }
    public Category Category { get; set; }
    public IEnumerable<Answer> Answers { get; set; }
}

public class Answer
{
    public int Id { get; set; }
    public int DisputeId { get; set; }
    public int UserId { get; set; }
    public int SelectedOption { get; set; }
    public string Comment { get; set; }
    public bool Flagged { get; set; }
    public DateTime DateCreated { get; set; }

    public Dispute Dispute { get; set; }
    public User User { get; set; }
}

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime DateCreated { get; set; }
    public bool Status { get; set; }

    public IEnumerable<Dispute> Disputes { get; set; }
}

public class DisputeCategory
{
    public int Id { get; set; }
    public int DisputeId { get; set; }
    public int CategoryId { get; set; }

    public Dispute Dispute { get; set; }
    public Category Category { get; set; }
}

私は私のDbContextで運がないと、次のを試してみました:

1)

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Answer>()
        .HasOne(p => p.User)
        .WithMany(b => b.Answers)
        .OnDelete(DeleteBehavior.Restrict);
}

2)

 protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
        modelBuilder.Entity<Answer>()
            .HasOne(p => p.User)
            .WithMany(b => b.Answers)
            .IsRequired(false);
 }

3)

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
    {
        relationship.DeleteBehavior = DeleteBehavior.Restrict;
    }
}

この設定を正しく行うためには何が必要ですか?

受け入れられた回答

私はこれがあなたの中で解決できると思いますエンティティにAnswerDisputeIdに変更してDisputeId

public class Answer
{
    public int Id { get; set; }
    public int? DisputeId { get; set; }
    //..

    public Dispute Dispute { get; set; }
    //..
}

このように関係を設定します。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Answer>()
        .HasOne(p => p.User)
        .WithMany(b => b.Answers)
        .HasForeignKey(s =>s.UserId) ;

    modelBuilder.Entity<Answer>()
        .HasOne(p => p.Dispute)
        .WithMany(b => b.Answers)
        .HasForeignKey(s =>s.DisputeId) ;
}

第2の関係は慣例によって任意であるため、あなたの問題を解決するはずです。

EFコアのドキュメントから:

慣例により、カスケード削除は、必要なリレーションシップのカスケードとオプションのリレーションシップの制限に設定されます。カスケードとは、依存エンティティも削除されることを意味します。制限は、メモリにロードされていない依存エンティティが変更されずに残っていることを意味し、手動で削除するか、有効なプリンシパルエンティティを指すように更新する必要があります。メモリにロードされたエンティティの場合、EFは外部キーのプロパティをnullに設定しようとします。

エンティティクラスに外部キープロパティがある場合、外部キープロパティが必須かオプションかに基づいて関係の必要性が決定されます



Related

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