私はしばらくこれに取り組んできましたが、何が起こっているのかよくわかりません。サイド(通常は2)を含むカードエンティティがあり、カードとサイドの両方にステージがあります。EF Codefirst移行を使用していますが、このエラーで移行が失敗します。
テーブル 'Sides'にFOREIGN KEY制約 'FK_dbo.Sides_dbo.Cards_CardId'を導入すると、サイクルまたは複数のカスケードパスが発生する可能性があります。ON DELETE NO ACTIONまたはON UPDATE NO ACTIONを指定するか、他のFOREIGN KEY制約を変更します。
これが私のカードエンティティです:
public class Card
{
public Card()
{
Sides = new Collection<Side>();
Stage = Stage.ONE;
}
[Key]
[Required]
public virtual int CardId { get; set; }
[Required]
public virtual Stage Stage { get; set; }
[Required]
[ForeignKey("CardId")]
public virtual ICollection<Side> Sides { get; set; }
}
これが私のサイドエンティティです:
public class Side
{
public Side()
{
Stage = Stage.ONE;
}
[Key]
[Required]
public virtual int SideId { get; set; }
[Required]
public virtual Stage Stage { get; set; }
[Required]
public int CardId { get; set; }
[ForeignKey("CardId")]
public virtual Card Card { get; set; }
}
そして、これが私のステージエンティティです:
public class Stage
{
// Zero
public static readonly Stage ONE = new Stage(new TimeSpan(0, 0, 0), "ONE");
// Ten seconds
public static readonly Stage TWO = new Stage(new TimeSpan(0, 0, 10), "TWO");
public static IEnumerable<Stage> Values
{
get
{
yield return ONE;
yield return TWO;
}
}
public int StageId { get; set; }
private readonly TimeSpan span;
public string Title { get; set; }
Stage(TimeSpan span, string title)
{
this.span = span;
this.Title = title;
}
public TimeSpan Span { get { return span; } }
}
奇妙なのは、Stageクラスに以下を追加した場合です。
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
移行は正常に実行されます。SSMSを開いてテーブルを見ると、それStage_StageId
がCards
(期待どおり/望ましい)に追加されていることがわかりSides
ますが、Stage
(予期されていない)への参照が含まれていません。
追加した場合
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
SideクラスではStageId
、Side
テーブルに列が追加されています。
これは機能していますが、私のアプリケーション全体で、への参照にStage
はが含まれてSideId
いますが、場合によってはまったく関係ありません。 可能な場合は参照プロパティでステージクラスを汚染することなく、上記のステージクラスに基づくプロパティを自分Card
とSide
エンティティに与えたいのStage
ですが、どうすればよいですか。
DeleteBehavior.Restrict
またはでカスケード削除を無効にする必要がありDeleteBehavior.SetNull
ます。
Side
クラスでNullable整数を追加し、[Required]
属性を削除する=>public int? CardId { get; set; }