EFCore简介

ORM:让开发者用对象操作的形式操作关系型数据库。
EFCore、Dapper就是常见的ORM

应用程序通过EF Core将C#代码变成Sql语句借助Ado.Net Core与数据库进行操作。

使用建议

1、对于后台系统、信息系统等和数据库相关开发工作量大的系统,且团队比较稳定就用EFCore;对于互联网系统等数据库相关工作量不大的系统,或者团队不稳定就用Dapper
2、在项目中可以混用,只要注意EFCore的缓存、Tracking等问题即可。

EFCore和EF比较

1、EF有DB First、Model First、Code First。EFCore不支持模型优先,推荐使用代码优先,遗留系统可以使用Scaffold DbContext来生成代码实现类似DB First的效果,但是推荐使用Code First。
2、EF会对实体上的标注做校验,EF Core追求轻量化,不校验。
3、EFCore加了很多新东西。
4、EF中的一些类的命名空间以及一些方法的名字在EF Core中稍有不同。
5、EF不再做新特性增加。
6、EF Core是对底层ADO.NET Core的封装,因此ADO.NET Core支持的数据库不一定被EF Core支持。

开发环境搭建

基本配置

安装:Microsoft.EntityFrameworkCore.SqlServer或其他用来使用不同的数据库。
1、建数据实体类比如Book,Person等。
2、建实现IEntityTypeConfiguration<T>接口的配置类,用来配置数据对应哪张表,T为实体类。
3、建继承DbContext的类,里面有一个或多个Dbset<T>属性用来声明这个数据库里面有几个表,T为实体类。该类有OnConfiguring方法用于使用数据库连接语句,还有OnModelCreating方法用于告诉EF Core数据库配置类从何处获取(一般为当前程序集)。
为了方便对应杨中科老师的教程,我将使用SqlServer进行演示,如果想使用MySql可以看之前几篇博客。
实体类:

1
2
3
4
5
6
7
8
9
10
11
public class Book {
public int id { get; set; }
public string name { get; set; }
public double money { get; set; }
}
public class Person {
public int id { get; set; }
public string name { get; set; }
public int age { get; set; }
public string sex { get; set;}
}

配置类:

1
2
3
4
5
6
7
8
9
10
11
public class BookEntityConfig : IEntityTypeConfiguration<Book> {
public void Configure(EntityTypeBuilder<Book> builder) {
builder.ToTable("T_Books");
builder.Property(e=>e.name).HasMaxLength(50).IsRequired();//设置书名最大长度50,不允许为空
}
}
public class PersonEntityConfig : IEntityTypeConfiguration<Person> {
public void Configure(EntityTypeBuilder<Person> builder) {
builder.ToTable("T_Persons");
}
}

DbContext类:

1
2
3
4
5
6
7
8
9
10
11
12
public class MyDbContext:DbContext {
public DbSet<Book> Books { get; set; }
public DbSet<Person> Persons { 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);
}
}

Migration数据库迁移

安装:Microsoft.EntityFrameworkCore.Tools。
面向对象的ORM开发中,数据库不是程序员手动创建的,而是Migration工具生成的。关系型数据库只是盛放模型数据的一个媒介而已,理想状态下,程序员不用关心数据库的操作。
根据对象的定义变化,自动更新数据库中的表以及表结构的操作叫做Migration(迁移)
迁移可以分为多步(项目进化),也可以回滚。
1、在程序包管理器控制台中执行:
Add-Migration 操作名
会自动在项目的Migrations文件夹中生成操作数据库的C#代码。
2、代码需要执行后才会应用对数据库的操作,所以程序不能有错误。在程序包管理器控制台中执行:
Updata-database

一些说明

配置类不是必须的,在EF Core中有约定大于配置的规则,会默认生成一个隐藏的配置类,如果想更改表名或者对某字段有进一步配置可以自己添加配置类。

EF Core进行增删改查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
internal class Program {
static async Task Main(string[] args) {
using(var db = new MyDbContext()) {
//1、增
db.Books.Add(new Book { name = "ES6标准入门", money = 57.5 });
db.Books.Add(new Book { name = "C#图解教程", money = 69 });
db.Books.Add(new Book { name = "单片微机原理", money = 30 });
db.Books.Add(new Book { name = "深入浅出NodeJS", money = 44 });
await db.SaveChangesAsync();//相当于Updata-Database
//2、删
var b = db.Books.Single(e => e.name == "C#图解教程");
db.Books.Remove(b);
await db.SaveChangesAsync();
//3、改
var b2 = db.Books.Single(e => e.name == "深入浅出NodeJS");
b2.name = "JAVA核心技术卷一";
await db.SaveChangesAsync();
//4、查
IQueryable<Book> books = db.Books.Where(e => e.money > 30);
foreach(var book in books) {
Console.WriteLine(book.name);
}
}
}
}

以前的删除、修改数据需要先查出来,性能低,在.NET7退出了比较高效的修改、删除的操作,详细操作可以查看官方文档。