1. 简介
一般而言, 本部分中的配置适用于关系数据库. 安装关系数据库提供程序时, 此处显示的变为可用扩展方法(原因在于共享的 Microsoft.EntityFrameworkCore.Relational 包).
2. 表映射
表映射标识在数据库中哪张表应该进行内容查询和保存操作.
2.1 约定
按照约定, 每个实体将设置为映射到名称与 DbSet<TEntity> 属性 (公开派生上下文中的实体) 相同的表中. 如果给定 DbSet<TEntity > 实体中不包含, 则使用类名称.
2.2 数据注释
可以使用数据注释来配置类型映射表.
- [Table("blogs")]
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- }
你还可以指定表所属的架构(数据库).
- [Table("blogs", Schema = "blogging")]
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- }
- 2.3Fluent API
你可以使用熟知的 API 来配置类型映射到的表.
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Blog>()
- .ToTable("blogs");
- }
- }
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- }
你还可以指定表所属的架构(数据库).
modelBuilder.Entity<Blog>().ToTable("blogs", schema: "blogging");
3. 列映射
列映射标识在数据库中应从哪些列数据中进行查询和保存.
3.1 约定
按照约定, 每个属性将会设置为映射到与属性具有相同名称的列.
3.2 数据注释
可以使用数据注释来配置属性映射到的那一列.
- namespace EFModeling.DataAnnotations.Relational.Column
- {
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- }
- public class Blog
- {
- [Column("blog_id")]
- public int BlogId { get; set; }
- public string Url { get; set; }
- }
- }
- 3.3Fluent API
您可以使用熟知的 API 来配置属性映射到的列.
- namespace EFModeling.FluentAPI.Relational.Column
- {
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Blog>()
- .Property(b => b.BlogId)
- .HasColumnName("blog_id");
- }
- }
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- }
- }
4. 数据类型
数据类型是指属性所映射到的列的数据库特定类型.
4.1 约定
按照约定, 数据库提供程序基于属性的. NET 类型选择数据类型. 它还会考虑其他元数据, 如配置的最大长度, 属性是否是主键的一部分等. 例如, SQL Server 的 DateTime,nvarchar(max) 用作键的属性.
4.2 数据注释
您可以使用数据注释为列指定精确的数据类型. 例如, 下面的代码将 Url 配置为一个非 unicode 字符串, 其最大 200 长度. Rating 为 5 至 2 小数位.
- public class Blog
- {
- public int BlogId { get; set; }
- [Column(TypeName = "varchar(200)")]
- public string Url { get; set; }
- [Column(TypeName = "decimal(5, 2)")]
- public decimal Rating { get; set; }
- }
- 4.3Fluent API
你还可以使用熟知的 API 为列指定相同的数据类型.
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Blog>(eb =>
- {
- eb.Property(b => b.Url).HasColumnType("varchar(200)");
- eb.Property(b => b.Rating).HasColumnType("decimal(5, 2)");
- });
- }
- }
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- public decimal Rating { get; set; }
- }
5. 主键
为每个实体类型的键引入 primary key(主键)约束.
5.1 约定
按照约定, 会将数据库中的主键命名为 PK_<type name>.
5.2 数据注释
不能使用数据批注配置主键的关系数据库的特定方面.
5.3Fluent API
你可以使用 API 在数据库中配置 primary key(主键)约束的名称.
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Blog>()
- .HasKey(b => b.BlogId)
- .HasName("PrimaryKey_BlogId");
- }
- }
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- }
6. 默认架构
如果没有为该对象显式配置架构, 则默认架构为将在其中创建对象的数据库架构.
6.1 约定
按照约定, 数据库提供程序将选择最适合的默认架构. 例如, Microsoft SQL Server 将使用 dbo 架构, 而且 SQLite 将不使用架构(因为 SQLite 不支持架构).
6.2 数据注释
不能使用数据批注设置默认架构.
6.3Fluent API
可以使用 API 来指定默认架构.
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.HasDefaultSchema("blogging");
- }
- }
7. 默认值
如果插入新行, 但没有为该列指定值, 则列的默认值为要插入的值.
7.1 约定
按照约定, 未配置默认值.
7.2 数据注释
不能使用数据批注设置默认值.
7.3Fluent API
你可以使用 API 指定属性的默认值.
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Blog>()
- .Property(b => b.Rating)
- .HasDefaultValue(3);
- }
- }
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- public int Rating { get; set; }
- }
还可以指定用于计算默认值的 SQL 片段.
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Blog>()
- .Property(b => b.Created)
- .HasDefaultValueSql("getdate()");
- }
- }
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- public DateTime Created { get; set; }
- }
8. 索引(关系数据库)
关系数据库中的索引映射到与实体框架核心中的索引相同的概念.
8.1 约定
按照约定, 索引命名为 IX_<type name>_<property name>. 对于复合索引 < property name>, 将成为以下划线分隔的属性名称列表.
8.2 数据注释
不能使用数据批注配置索引.
8.3Fluent API
你可以使用熟知的 API 来配置索引的名称.
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Blog>()
- .HasIndex(b => b.Url)
- .HasName("Index_Url");
- }
- }
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- }
你还可以指定筛选器.
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Blog>()
- .HasIndex(b => b.Url)
- .HasFilter("[Url] IS NOT NULL");
- }
- }
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- }
使用 SQL Server 提供程序 EF 为唯一索引中包含的所有可以为 null 的列添加 "IS NOT NULL" 筛选器. 若要重写此约定, 可以 null 提供一个值.
- class MyContext : DbContext
- {
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Blog>()
- .HasIndex(b => b.Url)
- .IsUnique()
- .HasFilter(null);
- }
- }
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- }
在 SQL Server 索引中包含列, 当查询中的所有列都作为键列或非键列包含在索引中时, 可以通过包含列配置索引以显著提高查询性能.
- class MyContext : DbContext
- {
- public DbSet<Post> Posts { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Post>()
- .HasIndex(p => p.Url)
- .IncludeProperties(p => new
- {
- p.Title,
- p.PublishedOn
- })
- .HasName("Index_Url_Include_Title_PublishedOn");
- }
- }
- public class Post
- {
- public int PostId { get; set; }
- public string Url { get; set; }
- public string Title { get; set; }
- public DateTime PublishedOn { get; set; }
- }
参考文献:
表映射
列映射
数据类型
主键
默认架构
默认值
索引(关系数据库)
来源: https://www.cnblogs.com/wzk153/p/11796464.html