하나의 모델에 두 개의 탐색 속성을 만드는 방법 (EF6 코드 먼저)
-
21-12-2019 - |
문제
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);
}
. 제휴하지 않습니다 StackOverflow