概念
EF Core全称Entity Framework Core.EF Core主要以代码优先的方法为目标,很少支持数据库优先的方法,因为EF Core不支持可视化数据库模型设计器或向导
环境搭建
Nuget 包
管理Nuget包中添加项目所使用的数据库,大致名称为Microsoft.EntityFrameworkCore.xxx
实体类
创建与数据库表结构大致一样的实体类,举例存在T_Students表,表中有Id、姓名、年龄,这三个字段,那么创建以下实体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| [Table("T_Students")] public class T_Students { public int Id { get; set; }
public string? Name { get; set; }
public int? age { get; set; } }
public class MyDbContext : DbContext { public DbSet<T_Students> T_Students { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("连接字符串"); } }
|
自动生成模型
微软官方提供了自动生成模型的方法,参考这里
以下步骤以VS用法为例
1.首先添加名为 Microsoft.EntityFrameworkCore.Design 的NuGet包
2.打开vs终端(工具-NuGet管理-控制台),输入:
1
| Scaffold-DbContext '连接字符串' Microsoft.EntityFrameworkCore.SqlServer
|
对于 SQL Server 或 Azure SQL,请使用 Microsoft.EntityFrameworkCore.SqlServer
上面这种提示那么就是成功了
**注:步骤2在控制台中如果报错提示无法识别命令’Scaffold-DbContext’,添加
1
| Microsoft.EntityFrameworkCore.Tools
|
NuGet包可解决**
数据操作
增加
在EfCore中保存有 SaveChanges() 与 SaveChangesAsync() 两种方法
前者保存时是同步的,会阻塞当前线程,当有处理大量数据时候,可能会导致程序的性能问题,而后者是异步方法,会开启一个新的线程来做这些操作
使用await来等待异步操作执行完成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| static async Task Add() { using (MyDbContext context = new MyDbContext()) { context.Add(new T_Students { Name = "张三",age = 21 }); await context.SaveChangesAsync(); }
MyDbContext context = new MyDbContext(); var s = new T_Students(); s.Name = "李四"; s.age = 22; context.T_Students.Add(s); await context.SaveChangesAsync(); }
|
删除、修改
EFCore的修改与删除都是先吧数据对象查询出来在进行操作,效率低,目前官方暂时没有支持高效的批量Update、Delete
有一个开源的批量修改删除项目可以参考Zack.EFCore.Batch
在EFCore 7中,微软官方已经开始支持批量修改以及批量删除的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| static async Task GetList() { var context=new MyDbContext(); await context.T_Students.Where(a => a.Id == 1).ExecuteDeleteAsync();
var s = context.T_Students.Where(a => a.Id == 1).FirstOrDefault(); context.T_Students.Remove(s); await context.SaveChangesAsync();
await context.T_Students.Where(a => a.Id==1).ExecuteUpdateAsync(a => a.SetProperty(aa => aa.Name, aa => "张三"));
var s2 = context.T_Students.Where(a => a.Id == 1).FirstOrDefault(); s2.Name = "王五"; await context.SaveChangesAsync();
}
|
查询
DbSet有实现 IEnumberable 接口,因此可以使用Linq来更为方便的进行数据库操作,EFCore会将Linq转换为sql语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| static async Task GetList() { var context = new MyDbContext();
var SList1 = await context.T_Students.ToListAsync();
var SList2 = await context.T_Students.Where(a => a.age < 22).ToListAsync();
var Student1 = context.T_Students.Where(a => a.Name == "张三").FirstOrDefault();
var SList4 = await context.T_Students.OrderByDescending(a => a.age).Skip(5).Take(3).ToListAsync();
var SList5 = context.T_Students.GroupBy(a => a.age).ToList().Select(a => { var count = a.Count(); return new { a.Key, count }; }).ToList(); }
|