EFCore-FluentAPI

EF Core-FluentAPI

在约定大于配置这一规则下,EF Core提供了一些约定配置

  • 表明采用DbContext中对应的DbSet的属性名
  • 数据表列的名字采用实体类的属性名字,列的数据类型采用实体类属性中最兼容的类型
  • 数据表列的可空性取决于对应实体类属性的可空性(通过属性类型的?来调整是否为可空)
  • 名字为Id的属性为主键,如果主键为short,int或者long类型,则默认采用自增字段
  • 如果主键为Guid类型,则默认采用默认的Guid生成机制生成主键值

FluentAPI

这种方式就是创建一个配置类以实现IEntityTypeConfiguration接口后对实体类(表)进行配置

这种方法配置起来更麻烦,但能解耦合

方法名说明
Ignore()忽略表中某一属性
HasColumnName()配置列名*(需要先获取属性)
HasColumnType()配置列的类型
HasKey()配置主键*(需要先获取属性)

FluentAPI并不只是可以使用在配置类中,也可以在DbContext的OnModelCreating方法中直接使用

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Book>(b =>
        {
            // 忽略Book实体类中的Title属性
            b.Ignore(b => b.Title);
        });
        
        // 使用这种方法对书实体类中的属性和表中列名做映射(ResultMapping)
        modelBuilder.Entity<Book>(b =>
        {                              
            b.Property(b => b.Title).HasColumnName("b_title");
        });
        
        // 使用这种方法对表中列的类型进行指定
        modelBuilder.Entity<Book>(b =>
        {
            b.Property(b => b.Title).HasColumnType("varchar(8)");
        });
        
        // 配置主键
        modelBuilder.Entity<Book>().HasKey(b => b.Id);
}

Data Annotation

使用特性(Java中的注解)这一方式来配置实体类和表

不推荐使用这种方式,因为耦合度高

Table
[Table("Books")]
public class Book
{
    public long Id { get; set; }
    public string Title { get; set; }
    public DateTime PubTime { get; set; }
    public double Price { get; set; }
}
Required&&MaxLength
[Required]
[MaxLength(50)]
public string Title { get; set; }