0

이중 관계를 만들려고합니다. 그에게 팀 및 선수 말할 수 있습니다 - 팀이 많은 선수이지만 하나의 주장이있다을 갱신 데이터베이스를 실행하는 경우이가 FOREIGN KEY 제약 조건과 충돌 ALTER TABLE 문의 라인을 따라 오류가 발생한다EF6 일대 다 및 동일 엔티티 간의 복수 대다

public class Team 
    { 
     public int Id { get; set; } 
     public virtual ICollection<Player> Players { get; set; } 

     public Player Captain { get; set; } 
     public int CaptainId { get; set; } 
    } 


    public class Player 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 

     [InverseProperty("Players")] 
     public virtual Team Team { get; set; } 
     public int TeamId { get; set; } 
    } 

"FK_dbo.Teams_dbo.Players_TeamId". 데이터베이스 "dev", 테이블 "dbo.Players", 열 'Id'에서 충돌이 발생했습니다. (내 실제 클래스 이름/필드에서 번역 중입니다)

답변

1

Fluent API를 사용하여 엔티티 관계를 명시 적으로 설명하십시오.

modelBuilder.Entity<Team>().HasMany(t => t.Players).WithRequired(p => p.Team).HasForeignKey(p => p.TeamId); 
modelBuilder.Entity<Team>().HasRequired(t => t.Captain).WithMany().HasForeignKey(t => t.CaptainId); 

위에서 볼 수 있듯이 팀 -> 캡틴 관계는 다 대일로 취급됩니다. 아마도 주어진 플레이어는 둘 이상의 팀장이 될 수는 없지만 팀 -> 플레이어 관계는 일대 다이기 때문에 주어진 플레이어는 둘 이상의 팀에 속하지 않으며이를 통해 쉽게 확보 할 수 있어야합니다 팀의 캡틴이 해당 팀의 플레이어이기 때문에 주어진 플레이어는 한 팀의 캡틴 일뿐입니다.

+0

감사합니다. 특수 효과를 사용할 수 있다면 어떨까요? (그리고 나는이 예제가 이상한 것들을 허락한다는 것에 동의한다.) 상당히 미흡한 예제. – Andiih

+0

미안하지만, 나는 주석을 사용하지 않는다. 그래서 나는 정말로 말할 수 없다. Fluent API를 사용하면 관계를 설명하는 데 훨씬 표현적이고 명시적일 수 있으므로 필자는이 점을 고수한다. –