2016-12-13 4 views
1

일부 속성이 들어있는 UserDetail 모델이 있는데 사용자에게 알려진 언어 및 알 수없는 언어 목록을 추가하려고합니다.C# Entity Framework 코드 우선 관계

나는 어떻게 할 수 있습니까? 첫째로 나는 두 개의 테이블 unknownLanguagesknownLanguages을 만들고 릴레이션을 하나씩 만들 필요가 있다고 생각합니다. 그러나 두 테이블 모두 ValueName과 같은 속성을 가지고 있습니다. 더 나은 해결책은 하나의 테이블을 생성하는 것입니다. 속성을 알려 지거나 알려지지 않은 것으로 나눌 수 있습니까? 내가 방법을 모르는 외에 작성되지 않았습니다

public class UserDetail 
{ 
    public UserDetail() 
    { 
     this.Languages = new HashSet<Language>(); 
    } 

    [Key, ForeignKey("User")] 
    public string Id { get; set; } 
    public DateTime Birthday { get; set; } 
    public string Gender { get; set; } 
    public string Country { get; set; } 
    public string About { get; set; } 

    public virtual ApplicationUser User { get; set; } 
    public virtual ICollection<Language> Languages { get; set; } 
} 

그러나 많은 많은 관계 :

언어 모델 :

public class Language 
{ 
    public Language() 
    { 
     this.UserDetails = new HashSet<UserDetail>(); 
    } 

    public int LanguageId { get; set; } 
    public string Value { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<UserDetail> UserDetails { get; set; } 
} 

UserDetail 모델을

내가 이렇게 이렇게 시도 나는 알려지지 않은 속성을 추가 할 수 있습니다.

제안 사항?

감사

+0

이름이 unknowLanguages ​​및 knownLanguages ​​인 두 개의 외래 키 (관계)를 추가 하시겠습니까? – Saadi

+1

일반적으로 데이터베이스에 "알 수없는 언어"가 저장되어 있지 않다고 생각합니다. 알려진 언어 목록에없는 언어는 정의 상으로는 알려지지 않았습니다. 아니면 당신에게 중요한 "채워지지 않은"것과 "알려지지 않은 채워진 것"사이의 구별은 무엇입니까? 그리고 데이터베이스에 "알려진"언어와 "알려지지 않은"언어가 동시에 존재할 가능성에 대해 당신은 무엇을하고 싶습니까? – hvd

답변

1

에서보세요 수 있습니다, 예를 들어 영어가 하나 뿐이고 영어가 하나만 있지만 여러 사용자가 영어를 알 수 있고 여러 사용자가 영어를 알지 못할 수도 있습니다. 따라서 사용자가 영어를 사용하는 방법을 설명하고 있습니다. 영어가 하나뿐이므로 수정 된 버전의 사용자를 각 사용자별로 수정하는 것은 표준화를 따르지 않습니다.

따라서 이러한 세부 정보는 매핑 테이블에 저장됩니다. 당신은 (대신 EF는 자동으로 당신을 위해 하나를 만들 수의)과 같이 생성 된 다 대다 매핑 테이블을 제어 할 수 있습니다

public class UserDetailLanguage 
{ 
    public Int32 Id { get; set; } 

    public virtual UserDetail UserDetail { get; set; } 
    public Int32 UserDetailId { get; set; } 

    public virtual Language Language { get; set; } 
    public Int32 LanguageId { get; set; } 

    public Boolean IsKnown { get; set; } 
} 
public class UserDetail 
{ 
    ... 
    public virtual ICollection<UserDetailLanguage> UserDetailLanguages { get; set; } 
    ... 
} 
public class Language 
{ 
    ... 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Value { get; set; } 

    public virtual ICollection<UserDetailLanguage> UserDetailLanguages { get; set; } 
    ... 
} 

편집 :

가 표시하려면이 사용하는 것입니다 :

//find all known languages for a user 
userDetail.UserDetailLanguages.Where(c => c.IsKnown).Select(c => c.Language) 

//find all unknown languages for a user 
userDetail.UserDetailLanguages.Where(c => !c.IsKnown).Select(c => c.Language) 

//find all known languages for all users 
_dbContext.Set<UserDetailLanguage>().Where(c => c.IsKnown).Select(c => c.Language) 

//find all unknown languages for all users 
_dbContext.Set<UserDetailLanguage>().Where(c => !c.IsKnown).Select(c => c.Language) 
+0

정확히이 작업을 수행하려고합니다. 감사합니다. – dmbb