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);
链式编程主要是看上一个方法返回的是否下一个可以使用即可。