使用 EF Core 构建关系数据库的更好方法
Better way to build relational database with EF Core
我是 EF Core 的新手,在设计合适的模型时遇到了问题。
我的目标是拥有三个数据库tables:
- Users(包含应用程序的用户(使用身份));
- Lanuages(表示用户可以说的语言)以下列:
- 编号
- 用户名
- 语言编号
- 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
我是 EF Core 的新手,在设计合适的模型时遇到了问题。
我的目标是拥有三个数据库tables:
- Users(包含应用程序的用户(使用身份));
- Lanuages(表示用户可以说的语言)以下列:
- 编号
- 用户名
- 语言编号
- 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