【EF Core】基础


简介

Entity Framework Core(EF Core)是微软官方的ORM框架。优点:功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异;缺点:复杂、上手门槛高、不熟悉EFCore的话可能会进坑。

Code First开发流程

  • 安装对应数据库的Nuget包,如下:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
  • 创建实体类
public class Book
{
    public long Id { get; set; }//主键
    public string Title { get; set; }//标题
    public DateTime PubTime { get; set; }//发布日期
    public double Price { get; set; }//单价
    public string AuthorName { get; set; }//作者名字
    public string Decription { get; set; }
    //public string Content { get; set; }
}
  • 创建实体配置类
    配置类需要实现接口IEntityTypeConfiguration,它是用来配置实体类和表的对应关系
public class BookEntityConfig : IEntityTypeConfiguration
{
    public void Configure(EntityTypeBuilder builder)
    {
        builder.ToTable("T_Books");
        builder.Property(e => e.Title).HasMaxLength(50).IsRequired();
        builder.Property(e => e.AuthorName).HasColumnType("varchar(100)").IsRequired();

    }
}
  • 创建DbContext
    public class TestDbContext : DbContext
    {
        public DbSet Books { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string connStr = "Data Source=.;Initial Catalog=EFCoreDB;User ID=sa;Password=123456";
            optionsBuilder.UseSqlServer(connStr);
            optionsBuilder.LogTo(Console.WriteLine);
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
        }
    }

约定映射规则

1:表名采用DbContext中的对应的DbSet的属性名。
2:数据表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型最兼容的类型。
3:数据表列的可空性取决于对应实体类属性的可空性。
4:名字为Id的属性为主键,如果主键为short, int 或者 long类型,则默认采用自增字段,如果主键为Guid类型,则默认采用默认的Guid生成机制生成主键值。

两种配置方式

Data Annotation

把配置以特性(Annotation)的形式标注在实体类中。

[Table("T_Books")]
public class Book
{
}

优点:简单;缺点:耦合。

Fluent API

把配置写到单独的配置类中。

builder.ToTable("T_Books");

缺点:复杂;优点:解耦

大部分功能重叠。可以混用,但是不建议混用。

EF系列:
https://blog.csdn.net/xingkongtianyuzhao/category_9704639.html

ef复杂查询: