표 2 에서 첫 번째 - 엔티티입니다 레임워크 코드 같은 외래 키

39, ve EF 코드를 사용하여 i& 막 시작한 첫 도왔으매 I& # 39 m, 전체 초보자 이 주제.

팀과 경기를 관계를 만들고 싶었다.

1 경기 = 2 팀 (홈, 게스트) 및 결과.

39 의 생각해봤죠 it& 쉽게 만들 수 있기 때문에 이런 모델을 시작했는데 코딩:

public class Team
{
    [Key]
    public int TeamId { get; set;} 
    public string Name { get; set; }

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

public class Match
{
    [Key]
    public int MatchId { get; set; }

    [ForeignKey("HomeTeam"), Column(Order = 0)]
    public int HomeTeamId { get; set; }
    [ForeignKey("GuestTeam"), Column(Order = 1)]
    public int GuestTeamId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team GuestTeam { get; set; }
}

그리고 난 프레젠테이션이든 예외:

&gt. 참조 릴레이션십 발생할 것이라고 주기적인 참조 허용되지 않습니다. [구속 name = Match_GuestTeam]

이러한 외래 키 같은 테이블 2 개 모델을 만들 수 있습니까?

해결책

이거 드세요.

public class Team
{
    public int TeamId { get; set;} 
    public string Name { get; set; }

    public virtual ICollection HomeMatches { get; set; }
    public virtual ICollection AwayMatches { get; set; }
}

public class Match
{
    public int MatchId { get; set; }

    public int HomeTeamId { get; set; }
    public int GuestTeamId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team GuestTeam { get; set; }
}

public class Context : DbContext
{
    ...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
                    .HasRequired(m => m.HomeTeam)
                    .WithMany(t => t.HomeMatches)
                    .HasForeignKey(m => m.HomeTeamId)
                    .WillCascadeOnDelete(false);

        modelBuilder.Entity()
                    .HasRequired(m => m.GuestTeam)
                    .WithMany(t => t.AwayMatches)
                    .HasForeignKey(m => m.GuestTeamId)
                    .WillCascadeOnDelete(false);
    }
}

기본 키 매핑되며 기본적으로 발생원인. 두 팀의 경기를 반드시 있어야 합니다. # 39, 두 개의 싱글 콜렉션+ 참조됨 fk 너회가 can& 없다. 이 때문에, t # 39 경기 없이 매핑됨 캐스케이딩이란 삭제하시겠습니까 doesn& 작업하십시오 다대다 자체 참조.

해설 (10)

39, s 도 it& 지정할 수 있습니다 () '' 포르니키 이동줄에 대한 속성 속성:

[ForeignKey("HomeTeamID")]
public virtual Team HomeTeam { get; set; }
[ForeignKey("GuestTeamID")]
public virtual Team GuestTeam { get; set; }

39 이쪽요 너회가 don& 모모델크레이트 '방법' 코드를 추가할 필요가 없다.

해설 (3)

39 의 로그하고 그러니까말이야 it& 몇 살 위 문제를 해결할 수 있는 솔루션이다. 하지만 난 그냥 계속 사용하여 제안하세요 린버스프로페티 사람을 위해 할 수 있습니다. 적어도 실망에는 don& # 39, 어떤 모모델크레팅 변경할 필요가 없다.

아래 코드는 취소 테스트.

public class Team
{
    [Key]
    public int TeamId { get; set;} 
    public string Name { get; set; }

    [InverseProperty("HomeTeam")]
    public virtual ICollection HomeMatches { get; set; }

    [InverseProperty("GuestTeam")]
    public virtual ICollection GuestMatches { get; set; }
}

public class Match
{
    [Key]
    public int MatchId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team GuestTeam { get; set; }
}

린버스프로페티 MSDN 에 대해 자세히 읽을 수 있습니다. f =, = - 2147217396 # 관계를 마스페로르 255&amp https://msdn.microsoft.com/en-us/data/jj591583?

해설 (4)

이 너무 볼 수 있습니다.

public class Match
{
    [Key]
    public int MatchId { get; set; }

    [ForeignKey("HomeTeam"), Column(Order = 0)]
    public int? HomeTeamId { get; set; }
    [ForeignKey("GuestTeam"), Column(Order = 1)]
    public int? GuestTeamId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team GuestTeam { get; set; }
}

Fk 열 수 있도록 만들 때, 당신은 null 깨고 사이클입니다. 캐논 EF 스키마에는 부정행위 또는 단지 발생기입니다.

내 경우, 이 단순한 수정 문제를 해결합니다.

해설 (1)

기본적으로 활성화됨 케스케이드 Deletes 때문이다. 문제는 a 의 삭제하시겠습니까 전화하시기 때 각 f 키를 referenced 엔티티에는 엔티티입니다 삭제합니다 잘 알려져 있다. # 39, & # 39 required& 하지 않고 합니다. 이 문제를 해결하기 위해 값을 누얼바이. # 39 의 더 나은 쪽을 약간만이라도 지루려면 EF 코드 First& 케스케이드 삭제하시겠습니까 규칙:

modelBuilder.Conventions.Remove(); 

39 의 it& 아마 할 때, 아이들의 안전한 명시적으로 있을 때 나탸내도록 케스케이드 각 삭제하시겠습니까 매핑 / 구성. 이 엔티티입니다.

해설 (1)

"'린버스프로페티"' 의 핵심 솔루션을 ef 는 쉽고 청소하십시오.

[린버스프로페티] [1]

  • 그래서 원하는 솔루션을 다시그것들을 be:*

"' public class 팀 { [핵심] int 테미드 {얻을 수 있다. 세트;} 공용 구체화하십시오 이름 {프레젠테이션이든. 세트. }

[린버스프로페티 (나미로프 (매크리호메팀)] 공용 ICollection&lt Match>; 호메매슈스 {프레젠테이션이든. 세트. }

[린버스프로페티 (나미로프 (마치스게스테이섬)] 공용 ICollection&lt Match>; 웨이매슈스 {프레젠테이션이든. 세트. } }

public class 해당되어서는 { [핵심] int 매키드 {얻을 수 있다. 세트. }

[포르니키 (나미로프 (호메팀), 열 (주문 = 0)] int 호메이미드 {얻을 수 있다. 세트. } [포르니키 (나미로프 (게스테이섬), 열 (주문 = 1)] int 구스타이미드 {얻을 수 있다. 세트. }

부동 소수점 호메푸앵츠 {얻을 수 있다. 세트. } 부동 소수점 게스트포린츠 {얻을 수 있다. 세트. } 공용 DateTime 날짜 {프레젠테이션이든. 세트. }

공용 고객팀에 호메팀 {프레젠테이션이든. 세트. } 공용 고객팀에 게스테이섬 {프레젠테이션이든. 세트. } } "'

[1]: # 린버스프로페티 https://docs.microsoft.com/en-us/ef/core/modeling/relationships

해설 (0)