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

时间:2018-04-02 19:52:06

标签: entity-framework asp.net-core ef-code-first entity-framework-core

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

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

  1. 用户(包含应用程序的用户(使用Identity));
  2. Lanuages (表示用户可以说的语言),包含以下列:
    • 编号
    • 用户ID
    • LanguageId
  3. LanguagesList (可用语言的静态列表),包含以下列:
    • 编号
    • 名称
  4. 这个想法是通过第三个表来绑定用户及其语言,第三个表只包含这样的ID:

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

    我创建的课程是:

    用户类:

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

    Lanuages:

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

    LanguageList

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

    我的数据库上下文类

    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();
        }
    }
    

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

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

1 个答案:

答案 0 :(得分:0)

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

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

......或类似的东西。

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