私はしばらくこれに取り組んできましたが、何が起こっているのかよくわかりません。サイド (通常は 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; }
}
そして、これが私のStageエンティティです:
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; } }
}
奇妙なのは、ステージ クラスに次のコードを追加した場合です。
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
ます...何が間違っていますか?