2012-03-29 14 views
0

から削除:EFカスケードは、私は、次の2つのエンティティを持つ2つの別々のテーブル

public class Field { 
    public int FieldID { get; set; } 
    public String Name { get; set; } 
    public int LocationID { get; set; } 

    public virtual ICollection<FieldPlanning> FieldPlannings { get; set; } 
} 

public class Timeslot { 
    public int TimeslotID { get; set; } 
    public DateTime Start { get; set; } 
    public int MatchDayID { get; set; } 

    public virtual ICollection<FieldPlanning> FieldPlannings { get; set; } 
} 

は現在、これらの2つのエンティティの組み合わせは、以下のエンティティを構成する:

public class FieldPlanning { 
    public int FieldPlanningID { get; set; } 
    public int TimeslotID { get; set; } 
    public int FieldID { get; set; } 


    public virtual Timeslot Timeslot { get; set; } 
    public virtual Field Field { get; set; } 
    public virtual Match Match { get; set; } 
} 

このエンティティは、その後も持っていますMatchエンティティへのナビゲーションプロパティですが、これを簡潔にするために残しました。

フィールドまたはタイムスロットのいずれかが削除されると、関連するFieldPlanningレコードも同様に削除する必要があります。

私がアプリケーションを実行すると、「Timeslot_FieldPlanningがサイクルまたは複数のカスケードパスを引き起こす可能性があります」というエラーが表示されます。

 modelBuilder.Entity<Timeslot>() 
      .HasMany(ts => ts.FieldPlannings) 
      .WithRequired(fp => fp.Timeslot) 
      .HasForeignKey(fp => fp.TimeslotID) 
      .WillCascadeOnDelete(false); 

フィールドを削除すると問題なくFieldPlanningが削除されます。タイムスロットを削除しようとすると、以前と同じエラーが発生します。

FieldまたはTimeslotのいずれかを削除できるように、また両方のエンティティに対してCascadeOnDeleteがtrueになるように修正するにはどうすればよいですか?

私はHans Riesebosの答えhereを読みましたが、問題にどのように適用するかを理解できませんでした。

EDIT: 現在地エンティティ:

public class Location { 
    public int LocationID { get; set; } 
    public String Name { get; set; } 
    public Address Address { get; set; } 
    public int TournamentID { get; set; } 

    public virtual Tournament Tournament { get; set; } 

    public virtual ICollection<Field> Fields { get; set; } 
} 

マイマッチエンティティ:それをしようとすると

が、私が特に適合するようにナビゲーションプロパティをコメントし、私が最初にそれを確認することができ

public class Match { 
    public int MatchID { get; set; } 
    public Boolean Forfeited { get; set; } 
    public int TeamAID { get; set; } 
    public int TeamBID { get; set; } 
    public int FieldPlanningID { get; set; } 


    public virtual Team TeamA { get; set; } 
    public virtual Team TeamB { get; set; } 
    public virtual FieldPlanning FieldPlanning { get; set; } 

    public virtual ICollection<Official> Officials { get; set; } 
} 
FieldPlanningとMatchの関係に問題があることを知っているので、これは0..1から0..1の関係であるため、Matchなしで作業しました。しかし、現行の問題でこの問題がどのように問題になるかはわかりません(Match in FieldPlanningのコメントプロパティを保持している限り)。

+0

問題は、おそらくあなたのロケーションエンティティとマッチエンティティとの関係にあります。これらのエンティティを表示してマッピングすることもできます。 –

+0

@ LadislavMrnkaこれらのエンティティも同様に追加しました。 – Mekswoll

答えて

0

もう少し検索したところ、thisというスレッドが見つかりました。これは、SQL Serverがこれを許可していないことを正しく示しています。問題はEntity Frameworkにあると思っていましたが、SSMSのテーブルを再作成しようとしたが、まだ動作していないことに気付きました。

解決策は、カスケード効果の1つを無効にし、トリガー(またはコード)を使用して最初に子行を削除することです。

関連する問題