ฉันต่อสู้กับสิ่งนี้มาระยะหนึ่งแล้วไม่สามารถเข้าใจได้ว่าเกิดอะไรขึ้น ฉันมีเอนทิตีการ์ดที่มีด้าน (ปกติ 2) - และทั้งการ์ดและด้านข้างมีสเตจ ฉันใช้การโยกย้าย EF Codefirst และการโยกย้ายล้มเหลวด้วยข้อผิดพลาดนี้:
การแนะนำข้อ จำกัด KEY ต่างประเทศ 'FK_dbo.Sides_dbo.Cards_CardId' บนตาราง 'ด้าน' อาจทำให้เกิดรอบหรือเส้นทางเรียงซ้อนหลายเส้นทาง ระบุ ON DELETE NO ACTION หรือ UPDATE NO ACTION หรือแก้ไขข้อ จำกัด ของกุญแจต่างประเทศ
นี่คือกิจการบัตรของฉัน:
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; }
ในคลาสของฉันฉันเห็นStageId
คอลัมน์เพิ่มลงในSide
ตาราง ของฉัน
สิ่งนี้ใช้งานได้ แต่ตอนนี้ตลอดทั้งแอปพลิเคชันของฉันการอ้างอิงใด ๆ ที่Stage
มี a SideId
ซึ่งในบางกรณีไม่เกี่ยวข้องทั้งหมด ฉันต้องการให้คุณสมบัติของฉันCard
และSide
เอนทิตี้ของฉันStage
ขึ้นอยู่กับคลาสของสเตจด้านบนโดยไม่ทำให้ชั้นสเตจมีคุณสมบัติอ้างอิงถ้าเป็นไปได้ ... ฉันทำอะไรผิด
DeleteBehavior.Restrict
DeleteBehavior.SetNull
Side
Class เพิ่มจำนวนเต็ม Nullable และลบ[Required]
attribute =>public int? CardId { get; set; }