당신은 당신이 (Team
와 BirthYears
사이의 관계이다) 일대 다 관계를 정의하기위한 다음과 같은 서명을 보게 될 EntityTypeConfiguration<TEntityType>
클래스를 살펴 걸릴 경우 : 당신이 볼 수 있듯이
HasMany<TTargetEntity>(Expression<Func<TEntityType, ICollection<TTargetEntity>>>
navigationPropertyExpression) where TTargetEntity : class;
을 에는 BirthYears
이 class
개체의 컬렉션이어야한다는 제약 조건이 있습니다. int
은 클래스가 아니므로 매핑을 할 수 없습니다. 다음
내가 볼 수있는 유일한 해결 방법은 약간의 클래스를 정의하는 것입니다
...
public class BirthYear
{
public int Id { get; set; }
public int Value { get; set; }
}
... 그리고 클래스 팀에 컬렉션에서이를 사용
public ICollection<BirthYear> BirthYears { get; set; }
매핑을 협약은 자동으로 일대 다 관계를 만들어야하므로 Fluent API가 연결을 설정할 필요가 없습니다. 코멘트에 라디의 올바른 비판에 따라
편집
보정 :
클래스 BirthYear
은 추가 키 속성이 필요합니다. 나는 Id
속성을 추가했습니다.
또한 BirthYears
은 Team
에 종속 된 속성이 될 것입니다. 매핑 규약에 따라 BirthYear
에서 Team
사이의 선택적 관계가 생성됩니다. 나는 모델이 유창함 API를 사용하여 필요한 관계를 확인하는 것이 더 적합하다고 생각 :
modelBuilder.Entity<Team>()
.HasMany(t => t.BirthYears)
.WithRequired();
이 자동으로 가능하게 할 것이다 계단식 삭제 - 팀이 삭제 될 때 관련 BirthYears는 데이터베이스에서 삭제됩니다.
편집 2
당신이 설정도 할 수 있었던 BirthYears 테이블에 수년 복제하지 않으려면 (다시 라디의 의견에 따라) 다 대다 관계 :
modelBuilder.Entity<Team>()
.HasMany(t => t.BirthYears)
.WithMany();
Team
과 BirthYear
사이의 조인 테이블 (TeamBirthYears
)을 데이터베이스에 추가합니다.저장 공간이나 성능 측면에서 볼 때 아무 것도 얻지 못할 것입니다 (BirthYear
클래스가 매우 작고 BirthYear
테이블의 레코드가 조인 테이블의 레코드와 같은 크기이기 때문에). 조만간 추가 속성을 사용하여 BirthYear
클래스를 확장하려는 경우 더 나은 방법 일 수 있습니다. 그렇지 않으면 개인적으로 일대 다 (One-To-Many) 관계로 간단하게 유지할 것입니다. 그러나 선택은 당신 것입니다.
예외가 발생합니다. 'BirthYear'에는 PK로 사용할 다른 속성이 있어야합니다. 또한 'BirthYear'을 별도의 엔티티 관계로 노출하면 다 대다가되거나 출생 연도가 반복 될 수 있습니다. –
@ 라디 슬라브 : 사실, 이것은 너무 엉성한 대답이었습니다. 힌트를 주셔서 감사합니다! 나는 지금 그것을 바로 잡았다. 그러나 다 대 다 관계가 발생할 것인가는 언제입니까? 나는 이제 작은 테스트를 만들었고, 일대 다 관계 인 것 같습니다. 위의 Fluent 코드가 없으며이 코드가 필요합니다. – Slauma
일대 다이지만 시나리오를 이해하면 다 대다 (many-to-many) 일 것입니다. 그렇지 않으면 동일한 값을 가진 BirthYear에 많은 레코드를 가질 수 있기 때문입니다. –