EF Core介绍:
EF Core 是一个ORM映射程序
2.EF Core提供的映射方式
1.1 把数据库模型映射成实体类 俗称:数据库优先(EF Core官方不推荐使用 更推荐使用代码优先 ,以前在EF中叫数据库优先,但现在在EF Core中官方成为反向工程)
优点:老项目已经有数据库的时候可直接用,直接生成实体类 很爽
缺点:初用很爽,越用越恶心,每次更新都得重新生成覆盖全部实体类,搞不好就GG
1.2把用C#代码建立的实体类直接映射成数据库 俗称:代码优先 (EF Core 官方推荐使用)
优点:效率高 方便 快捷 让开发人员不用过度关注数据库变化,可以把更多时间放在程序开发设计上
缺点:相比数据库优先,可能前期配置实体的时候可能会有点麻烦但是配置上限更高更灵活(算不上一个真正的缺点)
2.EF Core运行机制理解
上面说了EF Core是一个ORM映射程序 所以他是怎么映射的呢?
EF Core映射配置会有两种方式
2.1.约定 (EF Core内部自己规定的映射机制)
比如说EF Core会根据你写的C#实体类按照EF Core内部约定来进行映射
汽车实体类:
public class Car
{
public int CarId { get; set; }
public string CarName { get; set; }
public double CarPrice { get; set; }
public int CarBrand { get; set; }
}
映射后
Car因为是int类型而且字段名中包含Id字眼所以映射到数据库就会成为 主键自增且名称为CarId的字段
CarName 是string类型所以就会被映射成名称为CarName类型为nvarchar类型的字段
CarPrices是Double类型所以会被映射成名称为CarPrice类型为float的字段
2.2.配置(顾名思义就是让EF Core按照我们配置方式去映射数据库)
自定义配置又两种方式:
1.使用 fluent API 配置模型
public class CarConfiguration : IEntityTypeConfiguration<Car>
{
public void Configure(EntityTypeBuilder<Car> builder)
{
builder.ToTable("CarTB").HasKey(t => t.CarId);
builder.Property(x=>x.CarName).HasMaxLength(50).IsRequired();
builder.Property(x=>x.CarBrand).HasMaxLength(50).IsRequired();
}
}
建立一个继承IEntityTypeConfiguration<Car>的模型配置类CarConfiguration
实现Configure方法
builder.ToTable("CarTB").HasKey(t => t.CarId); //把Car类型映射成表表名为:CarTB,HasKey(t => t.CarId)//主键是CarId。
builder.Property(x=>x.CarName).HasMaxLength(50).IsRequired();//映射到数据库的CarTB表中的CarName字段长度为50,.IsRequired()不可以为空
没有配置的字段EF Core会按照约定的方式来映射
3.建立并配置数据库类进行使用
建立一个继承DbContext的类
并重写OnConfiguring方法和OnModelCreating方法
public class MyDbcontext:Microsoft.EntityFrameworkCore.DbContext
{
public DbSet<Car> Cars { get; set; }
//数据库配置
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSqlServer("数据库链接字符串");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//配置实体
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
}
解读这个类
可以把MyDbcontext类看作你的数据库 public DbSet<Car> Cars { get; set; }看作数据库中的表
OnConfiguring方法中的optionsBuilder.UseSqlServer()代表使用的那个数据库
OnModelCreating方法:读取实体的配置
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly):获取当前程序集中继承IEntityTypeConfiguration类型的配置类来进行实体映射
进行映射:
在程序包管理控制台中输入迁移命令
Add-Migration 迁移名称
执行完成后会生成一个迁移文件夹