有这样一个模型:
public class School
{
public School()
{
}
[Key]
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<Teacher> Teachers { get; set; }
public IEnumerable<Student> Students { get; set; }
}
有一个数据库上下文:
public class MainDbContext : DbContext
{
public MainDbContext(DbContextOptions<MainDbContext> options) : base(options)
{
Database.EnsureCreated();
}
public DbSet<School> Schools { get; set; }
}
在构建项目时,会创建一个数据库及其表。我希望在这个数据库中只看到一个表Schools,但我看到了以下内容:
- 有“多余的”桌子。
表中的列Schools如下所示:
下面是表构造函数的样子Students:
为什么列表School.Students和School.Teachers显示在单独的表格中?这可以以某种方式解决吗?
这是另一个问题。
据我了解:这一行表示该列是表中SchoolId的链接。是这样吗?School.IdSchools
我希望看到这样的表格Schools:





因为这是实体到数据库的映射的意图。换句话说,列表的显示是完全正确的,而您对它的外观的想法是错误的。
这样做有两个原因。
首先是在大多数 DBMS 中根本没有“列表”数据类型,而且根本不可能以不同的方式来做。
其次,在此实施中,您可以编辑每个学生和教师,而不管学校如何。
一旦您了解了如何使用它,当前的结构很可能会适合您。如果由于某种原因您需要其他东西 - 请尝试以下操作:
您可以将 Teacher 和 Student 类声明为Owned Entity Types,在这种情况下,它们将不需要其 Id 并且不能与学校分开编辑(但它们仍将保留在单独的表中)
可以将复杂的数据结构序列化为 XML 或 JSON 并一体放入数据库(但这会剥夺您正常搜索序列化对象的可能性)
您可以抛弃实体框架并切换到像 MongoDB 这样的面向文档的 DBMS。或者您可以切换到 Postgres,其中有“列表”和“嵌套表”数据类型(但您仍然必须丢弃实体框架才能使用它们)。