C#Entity Framework代码优先关系

时间:2016-12-13 13:47:51

标签: c# asp.net-mvc entity-framework entity-relationship

我有UserDetail模型,其中包含一些属性,我想向用户添加已知和未知语言列表。

我有一个问题:我该怎么做?首先,我认为我需要创建两个表unknownLanguagesknownLanguages以及一对多的关系,但这两个表都具有相同的属性,如ValueName所以也许是更好的解决方案是创建一个表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; }
}

但除了我不知道如何添加已知和未知的财产之外,还没有创建多对多的关系。

有什么建议吗?

此致

2 个答案:

答案 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)