实体类型Entity Types

在上下文中包含一种类型的 DbSet,这意味着它包含在 EF Core 的模型中;我们通常将此类类型称为实体。 EF Core 可以从/向数据库中读取和写入实体实例,如果使用的是关系数据库,EF Core 可以通过迁移为实体创建表。

在模型中包含类型Including types in the model

按照约定,在上下文中的 DbSet 属性中公开的类型作为实体包含在模型中。 还包括在 OnModelCreating 方法中指定的实体类型,就像通过递归方式浏览其他发现的实体类型的导航属性找到的任何类型一样。

在下面的代码示例中,包含了所有类型:

  • Blog 包含在内,因为它在上下文的 DbSet 属性中公开。
  • 包含 Post 是因为它是通过 Blog.Posts 导航属性发现的。
  • AuditEntry,因为它是在 OnModelCreating中指定的。
  1. class MyContext : DbContext
  2. {
  3. public DbSet<Blog> Blogs { get; set; }
  4. protected override void OnModelCreating(ModelBuilder modelBuilder)
  5. {
  6. modelBuilder.Entity<AuditEntry>();
  7. }
  8. }
  9. public class Blog
  10. {
  11. public int BlogId { get; set; }
  12. public string Url { get; set; }
  13. public List<Post> Posts { get; set; }
  14. }
  15. public class Post
  16. {
  17. public int PostId { get; set; }
  18. public string Title { get; set; }
  19. public string Content { get; set; }
  20. public Blog Blog { get; set; }
  21. }
  22. public class AuditEntry
  23. {
  24. public int AuditEntryId { get; set; }
  25. public string Username { get; set; }
  26. public string Action { get; set; }
  27. }

从模型中排除类型Excluding types from the model

如果您不希望在模型中包含某一类型,则可以排除它:

  1. [NotMapped]
  2. public class BlogMetadata
  3. {
  4. public DateTime LoadedFromDatabase { get; set; }
  5. }
  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3. modelBuilder.Ignore<BlogMetadata>();
  4. }

表名Table name

按照约定,每个实体类型将设置为映射到与公开实体的 DbSet 属性同名的数据库表。 如果给定实体不存在 DbSet,则使用类名称。

可以手动配置表名:

  1. [Table("blogs")]
  2. public class Blog
  3. {
  4. public int BlogId { get; set; }
  5. public string Url { get; set; }
  6. }
  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3. modelBuilder.Entity<Blog>()
  4. .ToTable("blogs");
  5. }

表架构Table schema

使用关系数据库时,表按约定在数据库的默认架构中创建。 例如,Microsoft SQL Server 将使用 dbo 架构(SQLite 不支持架构)。

你可以配置要在特定架构中创建的表,如下所示:

  1. [Table("blogs", Schema = "blogging")]
  2. public class Blog
  3. {
  4. public int BlogId { get; set; }
  5. public string Url { get; set; }
  6. }
  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3. modelBuilder.Entity<Blog>()
  4. .ToTable("blogs", schema: "blogging");
  5. }

您还可以在模型级别定义 Fluent API 的默认架构,而不是为每个表指定架构:

  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3. modelBuilder.HasDefaultSchema("blogging");
  4. }

请注意,设置默认架构也会影响其他数据库对象,如序列。