实体类型
在DbContext中包含一种类型的DbSet,意味着它包含在EF Core的模型中;我们通常将此类类型称为 实体 (Entity)。EF Core可以从数据库中读取和写入实体实例,如果是关系型数据库,EF Core可以通过迁移(Migration)为实体创建表。
1、在模型中包含类型
约定:在DbContext的DbSet属性中公开的类型(public)作为实体包含在模型中。还包括方法中指定的实体类型OnModelCreating,就像通过递归方式浏览其他发现的实体类型的导航属性找到任何类型一样。
示例中,包含了所有的类型:
- 包含Blog,因为它在DbContext中的DbSet属性中公开。
- 包含Post,因为它通过Blog.Posts导航属性发现。
- AuditEntity 因为它是在ConModelCreating指定的
class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<AuditEntry>(); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public Blog Blog { get; set; } } public class AuditEntry { public int AuditEntryId { get; set; } public string Username { get; set; } public string Action { get; set; } }
提示:别忘了安装NuGet包。
2、从模型中排除类型
如果不希望在模型中包含某一类型,则可以排除它。3种方式:
1、Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Ignore<BlogMetadata>(); }
2、数据批注
[NotMapped] public class BlogMetadata { public DateTime LoadedFromDatabase { get; set; } }
3、从迁移中排除-EF Core 5 新特性
有时在多个DbContext类型中映射相同的实体类型会很用。当使用绑定上下文(又叫有界上下文)时,尤其是对于DbContext每个边界上下文都有不同类型的情况:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<IdentityUser>() .ToTable("AspNetUsers", t => t.ExcludeFromMigrations()); }
此配置迁移不会创建 AspNetUsers
该表,但 IdentityUser
仍包含在模型中,并且可正常使用。如果需要再次使用迁移来管理表,则应创建不包括AspNetUsers
的新迁移 。 下一次迁移将包含对表所做的任何更改。
3、表名称
约定:每个实体类型将映射到与公开实体的DbSet属性相同的数据库表。如果给定实体不存在DbSet,则使用类名称。
数据批注:
[Table("blogs")] public class Blog { public int BlogId { get; set; } public string Url { get; set; } }
Fluent API:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .ToTable("blogs"); }
使用关系数据库时,表按约定在数据库的默认架构中创建。 例如,Microsoft SQL Server 将使用 dbo
架构。如何映射到自定义Schema呢,2种方式:
1、数据批注,需要用到数据注入(注意Schema是Table属性的属性):
using System.ComponentModel.DataAnnotations.Schema;
…… [Table("blog",Schema ="ER")] public class BlogModel { public int BlogId { get; set; } public string Url { get; set; } public List<PostModel> Posts { get; set; } }
2、Fluent API:
class MyDbContext: DbContext { public DbSet<BlogModel> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("ER").Entity<AuditEntity>(); } }