나는 이것을 잠시 동안 레슬링 해 왔으며 무슨 일이 일어나고 있는지 알 수 없습니다. 사이드 (일반적으로 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; } }
}
이상한 점은 스테이지 클래스에 다음을 추가하면 다음과 같습니다.
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
포함되어 있으며 SideId
경우에 따라 전혀 관련이 없습니다. 난 그냥 내주고 싶습니다 Card
및 Side
단체 Stage
참조 속성 가능한 경우와 무대 클래스 오염없이 무대 위의 클래스를 기반으로 재산을 ... 내가 잘못을하고있는 중이 야 무엇을?
DeleteBehavior.Restrict
또는로 계단식 삭제를 비활성화해야합니다 DeleteBehavior.SetNull
.
Side
클래스 에서 Nullable 정수를 추가하고[Required]
속성을 제거하십시오 =>public int? CardId { get; set; }