2016-04-12 25 views
0

問題があります。 私はこのように見えるいくつかのクラスている:彼らは多くの関係に多くをEF多対多カスケード削除

public class Question 
{ 
    public int Id { get; set; } 
    [Required] [MaxLength(255)] public string Text { get; set; } 
    public int CriteriaId { get; set; } 
    public int QuestionGroupId { get; set; } 

    public QuestionGroup QuestionGroup { get; set; } 
    public virtual IList<Answer> Answers { get; set; } 
    public virtual Criteria Criteria { get; set; } 
} 

public class Answer 
{ 
    public int Id { get; set; } 
    [Required] [MaxLength(255)] public string Text { get; set; } 
    public int QuestionId { get; set; } 

    public Question Question { get; set; } 
    public virtual IList<State> States { get; set; } 
} 

public class Criteria 
{ 
    public int Id { get; set; } 
    [Required] [MaxLength(100)] public string Name { get; set; } 

    public virtual IList<State> States { get; set; } 
    public IList<Question> Questions { get; set; } 
} 

public class State 
{ 
    public int Id { get; set; } 
    public int CriteriaId { get; set; } 
    [Required] [MaxLength(100)] public string Name { get; set; } 
    public int Score { get; set; } 

    public virtual IList<Filter> Filters { get; set; } 
    public Criteria Criteria { get; set; } 
} 

を持っているので、私はこのマッピングを作成しました:

modelBuilder.Entity<Answer>() 
    .HasMany(m => m.States) 
    .WithMany() 
    .Map(m => { 
     m.MapLeftKey("AnswerId"); 
     m.MapRightKey("StateId"); 
     m.ToTable("AnswerStates"); 
    }); 

私は自分のデータベースを更新しようとしたとき、私はに関するエラーが出ます外部キー。 だから私は(一時的な修正として)この行を追加:

modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 

しかし、私はカスケード削除する必要があります。 なぜそれが私に許されないのか分かりません。カスケードが含まれるようにしようとすると、削除されたときに私が手 エラーがある:サイクルまたは複数のカスケードパスを引き起こす可能性がFOREIGN KEY制約「FK_dbo.AnswerStates_dbo.States_StateId」「AnswerStates」テーブル上の紹介

。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。

私は十分な情報を提供したいと考えています。誰もが私はまたは回答を削除できるようにする必要があります(カスケード削除できるようにするために何ができるかを知ってい、それはAnswerStates

+0

それは直接ポストから見ていません、 'Answer.Question'と' State.Criteria'に由来する一般的なカスケード削除パスがあるようです。 'Question'と' Criteria'モデルを投稿できますか? –

+0

うまくいけば、それらを追加しました – r3plica

+0

複数のカスケードパスは、 'States'プロパティを持つ' Criteria'と 'Answer'の両方によって引き起こされるので、それらは両方ともカスケード削除状態を試みます。さらに、多対多はカスケード削除では決して実装されません。マイグレーションで手動で追加するか、または関連付けを「1-n-1」に変更する必要があります。つまり、モデルにエンティティとして「AnswerStates」を描画します。 –

答えて

1

これはかなり同じであるからレコードを削除するには別の質問(Deleting only one entry from Many-to-Many relationship)今日は答えた。ちょうどあなたの場合はもう少し複雑です。

あなたのケースでは、複数のカスケードパスはCriteriaからAnswerStatesにある。Criteriaレコードを削除する場合は、AnswerStatesレコードはいずれかによって削除することができますCriteria->States->AnswerStatesまたはCriteria->Questions->Answers->AnswerStates関係。

解決策は常に同じで、関係の1つをオフにして、手動またはトリガーを使用して削除を処理します。この特定のケースで

、私の提案はCriteria->Statesカスケードオフ削除有効にすることです:

modelBuilder.Entity<Criteria>() 
    .HasMany(m => m.States) 
    .WithRequired(d => d.Criteria) 
    .HasForeignKey(d => d.CriteriaId) 
    .WillCascadeOnDelete(false); 

Criteriaを削除する前に、このようなものを使用する:

db.States.RemoveRange(db.States.Where(s => s.CriteriaId == criteriaId_to_be_removed)); 
関連する問題