我有UserDetail
模型,其中包含一些属性,我想向用户添加已知和未知语言列表。
我有一个问题:我该怎么做?首先,我认为我需要创建两个表unknownLanguages
和knownLanguages
以及一对多的关系,但这两个表都具有相同的属性,如Value
和Name
所以也许是更好的解决方案是创建一个表Languages
,其中包含多对多关系,但是我如何将属性划分为已知和未知?
我尝试这样做:
语言模型:
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型号:
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; }
}
但除了我不知道如何添加已知和未知的财产之外,还没有创建多对多的关系。
有什么建议吗?
此致
答案 0 :(得分: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)
答案 1 :(得分:0)
您可以拥有一个基类Language
,并从knownLanguages
和unknownLanguages
派生两个类
请看这里https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines