使用 EF Core 构建关系数据库的更好方法

Better way to build relational database with EF Core

我是 EF Core 的新手,在设计合适的模型时遇到了问题。

我的目标是拥有三个数据库tables:

  1. Users(包含应用程序的用户(使用身份));
  2. Lanuages(表示用户可以说的语言)以下列:
    • 编号
    • 用户名
    • 语言编号
  3. LanguagesList(可用语言的静态列表)包含以下列:
    • 编号
    • 姓名
    • 代码
    • .

我们的想法是通过第三方 table 绑定用户和他们的语言,这将只包含这样的 ID:

Id    UserId    LanguageId
1     56        1
2     56        2
3     57        1

我创建的 classes 是:

用户class:

public class ApplicationUser : IdentityUser
{
   public List<Language> SpokenLanguages { get; set; }
}

语言:

public class Language
{
    public int Id { get; set; }
    public ApplicationUser User { get; set; }
    public LanguageList LanguageList { get; set; }
}

语言列表

public class LanguageList
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
}

我的 数据库上下文 class:

public class ApplicationContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Language> Languages { get; set; }
    public DbSet<LanguageList> LanguageList { get; set; }
}

我尝试更新数据库的方式是(控制台风格):

public class _TestController : Controller
{
    // Database context.
    private ApplicationContext ApplicationContext { get; set; }
    // ctor
    public _TestController(ApplicationContext applicationContext)
    {
        this.ApplicationContext = applicationContext;
    }

    public IActionResult Index()
    {
        List<LanguageList> allLanguages = this.ApplicationContext.LanguageList.ToList();
        ApplicationUser user = new ApplicationUser();

        Language language = new Language
        {
            LanguageList = allLanguages.FirstOrDefault(lang => lang.Name == "English"),
            User = user
        };

        user.SpokenLanguages = new List<Language>();
        user.SpokenLanguages.Add(language);

        this.ApplicationContext.Languages.Add(language);
        this.ApplicationContext.Users.Add(user);
        this.ApplicationContext.SaveChanges();
    }
}

此代码在数据 tables 中创建了正确的行,但是当我尝试从上下文中获取 ApplicationUser 时,它 属性 SpokenLanguages 始终为 null。

此代码有什么问题以及为什么 SpokenLanguages 属性 的值始终为空?

你已经建立了一些关系,但 EF 不会遵循这些关系,除非你告诉它。您可以使用 Include 方法执行此操作:

var users = ApplicationContext.Users.Include(u => u.SpokenLanguages).ToList();

...或类似的东西。

https://docs.microsoft.com/en-us/ef/core/querying/related-data