문제

EF6 코드 첫 번째 컨벤션을 사용하여 두 개의 외래 키가있는 모델을 동일한 테이블에 만들고 싶습니다.예를 들어, 이제 모델 :

public class Team
{
    public Guid Id { get; set; }
    public String Name { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}
.

경기 모델 :

public class Match
{
    public Guid Id { get; set; }
    public Int32 TeamHomeScore { get; set; }
    public Int32 TeamAwayScore { get; set; }

    public Guid TeamHomeId { get; set; } // I want these properties to be foreign keys
    public Guid TeamAwayId { get; set; } //

    public virtual Team TeamHome { get; set; }
    public virtual Team TeamAway { get; set; }
}
.

그러나 프로젝트 실행 후 다음 예외가 있습니다.

외래 키 제약 조건을 소개하는 'TEAMS_TEAMHOMEID'테이블 '일치'일치는주기 또는 다중 캐스케이드 경로를 유발할 수 있습니다.Delete On Delete 아니 조치 또는 업데이트 작업 없음 작업 없음 또는 다른 외래 키 제약 조건을 수정하십시오. 제약 조건을 만들 수 없습니다.

권장 사항은 무엇입니까?

도움이 되었습니까?

해결책

SQL Server는 여러 캐스케이드 경로를 처리 할 수 없기 때문에 오류를 반환합니다.다중 경로는 속성을 가진 일치 입니다.

삭제할 때 캐스케이드를 false로 설정합니다.

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Match>()
                    .HasRequired<Team>(i => i.TeamHome)
                    .WithMany(i => i.Matches)
                    .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }
.

캐스케이드 삭제가 없으므로 팀 자체를 삭제하기 전에 팀의 일치 항목을 먼저 삭제해야합니다.

다른 팁

마이그레이션을 사용하는 경우 이것을 시도하십시오.마이그레이션은 매번 스마트하지 않으므로 코드를 때로는 코드를 interreput해야합니다.

public class Match
{
    public Guid Id { get; set; }
    public Int32 TeamHomeScore { get; set; }
    public Int32 TeamAwayScore { get; set; }

    public Guid TeamHomeId { get; set; } // I want these properties to be foreign keys
    public Guid TeamAwayId { get; set; } //

    [ForeginKey("TeamHomeId")]
    public virtual Team TeamHome { get; set; }
    [ForeginKey("TeamAwayId")]
    public virtual Team TeamAway { get; set; }
}
.

다음 datacontex.cs

에 아래에 추가됩니다.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
modelBuilder.Entity<Match>()
               .HasRequired(a => a.TeamHome )
               .WithMany()
               .HasForeignKey(u => u.TeamHomeId);

modelBuilder.Entity<Match>()
               .HasRequired(a => a.TeamAway )
               .WithMany()
               .HasForeignKey(u => u.TeamAwayId);
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top