2011-04-06 3 views
4

내 클래스에 대해이 속성이 있습니다 팀EF CTP5와 함께 ICollection에 <int>을 저장하는 방법

[Key] 
public virtual long Id { get; set; } 

public Guid ClubIdentifier { get; set; } 
public GenderEnum Gender { get; set; } 
public TeamAgeCategoryEnum TeamAgeCategory { get; set; } 
public ICollection<int> BirthYears { get; set; } 

내가, 내가 EF 기반 내 데이터베이스를 생성시키고있다 내 데이터베이스에 등록 BirthYears의 콘텐츠를 저장할 수있는 방법을 모델에서는 BirthYears 속성이 데이터베이스에 저장되지 않습니다. int-value와 My Team Id 값을 보유하는 새로운 테이블을 기대했을 것입니다.

무엇을 놓쳤는 지, 나는 내 저장소 클래스에서 OnModelCreating 메소드를 수행해야한다고 생각한다.

답변

5

당신은 당신이 (TeamBirthYears 사이의 관계이다) 일대 다 관계를 정의하기위한 다음과 같은 서명을 보게 될 EntityTypeConfiguration<TEntityType> 클래스를 살펴 걸릴 경우 : 당신이 볼 수 있듯이

HasMany<TTargetEntity>(Expression<Func<TEntityType, ICollection<TTargetEntity>>> 
    navigationPropertyExpression) where TTargetEntity : class; 

을 에는 BirthYearsclass 개체의 컬렉션이어야한다는 제약 조건이 있습니다. int은 클래스가 아니므로 매핑을 할 수 없습니다. 다음

내가 볼 수있는 유일한 해결 방법은 약간의 클래스를 정의하는 것입니다

...

public class BirthYear 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
} 

... 그리고 클래스 팀에 컬렉션에서이를 사용

public ICollection<BirthYear> BirthYears { get; set; } 

매핑을 협약은 자동으로 일대 다 관계를 만들어야하므로 Fluent API가 연결을 설정할 필요가 없습니다. 코멘트에 라디의 올바른 비판에 따라

편집

보정 :

클래스 BirthYear은 추가 키 속성이 필요합니다. 나는 Id 속성을 추가했습니다.

또한 BirthYearsTeam에 종속 된 속성이 될 것입니다. 매핑 규약에 따라 BirthYear에서 Team 사이의 선택적 관계가 생성됩니다. 나는 모델이 유창함 API를 사용하여 필요한 관계를 확인하는 것이 더 적합하다고 생각 :

modelBuilder.Entity<Team>() 
      .HasMany(t => t.BirthYears) 
      .WithRequired(); 

이 자동으로 가능하게 할 것이다 계단식 삭제 - 팀이 삭제 될 때 관련 BirthYears는 데이터베이스에서 삭제됩니다.

편집 2

당신이 설정도 할 수 있었던 BirthYears 테이블에 수년 복제하지 않으려면 (다시 라디의 의견에 따라) 다 대다 관계 :

modelBuilder.Entity<Team>() 
      .HasMany(t => t.BirthYears) 
      .WithMany(); 

TeamBirthYear 사이의 조인 테이블 (TeamBirthYears)을 데이터베이스에 추가합니다.저장 공간이나 성능 측면에서 볼 때 아무 것도 얻지 못할 것입니다 (BirthYear 클래스가 매우 작고 BirthYear 테이블의 레코드가 조인 테이블의 레코드와 같은 크기이기 때문에). 조만간 추가 속성을 사용하여 BirthYear 클래스를 확장하려는 경우 더 나은 방법 일 수 있습니다. 그렇지 않으면 개인적으로 일대 다 (One-To-Many) 관계로 간단하게 유지할 것입니다. 그러나 선택은 당신 것입니다.

+1

예외가 발생합니다. 'BirthYear'에는 PK로 사용할 다른 속성이 있어야합니다. 또한 'BirthYear'을 별도의 엔티티 관계로 노출하면 다 대다가되거나 출생 연도가 반복 될 수 있습니다. –

+0

@ 라디 슬라브 : 사실, 이것은 너무 엉성한 대답이었습니다. 힌트를 주셔서 감사합니다! 나는 지금 그것을 바로 잡았다. 그러나 다 대 다 관계가 발생할 것인가는 언제입니까? 나는 이제 작은 테스트를 만들었고, 일대 다 관계 인 것 같습니다. 위의 Fluent 코드가 없으며이 코드가 필요합니다. – Slauma

+0

일대 다이지만 시나리오를 이해하면 다 대다 (many-to-many) 일 것입니다. 그렇지 않으면 동일한 값을 가진 BirthYear에 많은 레코드를 가질 수 있기 때문입니다. –

관련 문제