EF Core 实体类配置

约定大于配置 意思是如果没有特殊要求 则不需要自己单独配置 使用默认即可

1.数据库表名采用上下文类中对应的DBSet的属性名
2.数据库表列的名字采用实体类属性的名字,列数据类型采用和实体类属性类型兼容的类型。如SQL Server中,string 对应nvarchar,long 对应bigint
3.数据库表列的可空性取决于对应的实体类属性的可空性。EF Core6中支持C#中的可空引用类型
4.名字为Id的属性为主键,如果主键为short,int or long 类型,则主键默认采用自增长类型的列。

[Required]-->不能为null

[MaxLength(20)]-->最大长度20

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

[Table("T_Books")]
public class Book
{
    public long Id { get; set; }//主键
    [MaxLength(50)]
    [Required]
    public string Title { get; set; }//标题
    public DateTime PubTime { get; set; }//发布日期
    public double Price { get; set; }//单价
    [MaxLength(20)]
    [Required]
    public string AuthorName { get; set; }//作者名字
}
还可以用FluentAPI配置(FluentAPI和Data Annotation 特性这种方式功能大部分重叠 2选一即可)
/*
FluentAPI(官方推荐)功能全 优先级高
Data Annotation  简单 功能没那么全  
可以一起使用 不推荐
*/
//以下都是采用FluentAPI方式
//以下是将实体类 Blog 与数据库中的blogView视图映射
 protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>().ToView("blogView");
    }
//排除部分属性 实体类Name 不映射
modelBuilder.Entity<Author>().Ignore(b=>b.Name);
//默认属性名和数据库一样 不一样可以这样配置
modelBuilder.Entity<Author>().Property("Name").HasColumnName("name");
//(个人推荐 字段可以点出来不易出错)
 modelBuilder.Entity<Author>().Property(a=>a.Name).HasColumnName("name");   
列数据类型
//配置字段类型和长度
modelBuilder.Entity<Author>().Property(a => a.Name).HasColumnType("varchar(20)");
主键
//配置不是id的字段为主键  配置Name为主键
modelBuilder.Entity<Author>().HasKey(a=>a.Name);  
索引 (默认情况下配置的都不是唯一索引)
 //id配置为索引
 modelBuilder.Entity<Author>().HasIndex(a=>a.Id);(个人推荐 字段可以点出来不易出错)
 modelBuilder.Entity<Author>().HasIndex("Id");
//复合索引  多个索引 将id,name都作为索引
modelBuilder.Entity<Author>().HasIndex(a => new { a.Id,a.Name});
//id配置为唯一索引
 modelBuilder.Entity<Author>().HasIndex(a => a.Id).IsUnique();
//id配置为聚集索引
modelBuilder.Entity<Author>().HasIndex(a => a.Id).IsClustered();
复合使用
modelBuilder.Entity<Book>().ToTable("T_Books").HasIndex(b => b.Title);
//modelBuilder.Entity<Book>().Ignore(b => b.PubTime);

链式编程主要是看上一个方法返回的是否下一个可以使用即可。