我给你讲最实用、企业级、能直接开发的 EF Core 完整知识,不搞虚的。
一、EF Core 到底是什么?
全称:Entity Framework Core 一句话:.NET 官方的数据库操作框架(ORM)
作用:
- 不用写复杂的 SQL 语句
- 用 C# 代码 直接操作数据库
- 自动生成表、自动处理增删改查
- 支持所有主流数据库(SQLite、SQL Server、MySQL、PostgreSQL)
简单说:写 C# = 操作数据库
二、EF Core 核心优势(为什么必须学)
- 跨平台:Windows / Linux / macOS 都能用
- 轻量高性能:比旧版 EF 快很多
- 自动建表/更新表:不用手动管理数据库结构
- 强类型:编译时检查错误,不会写错字段名
- 支持 LINQ 查询:用 C# 语法查数据,超级简单
- .NET 原生集成:和 ASP.NET Core 完美配合
三、核心概念(必须掌握)
1. 实体类(Entity)
对应数据库里的一张表
public class Product
{
public int Id { get; set; } // 主键(约定大于配置)
public string Name { get; set; } = string.Empty;
public decimal Price { get; set; }
}
2. DbContext(数据库上下文)
EF Core 最核心对象
- 管理数据库连接
- 跟踪数据变化
- 提供所有操作方法
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options) { }
public DbSet<Product> Products { get; set; } // 对应表
}
3. DbSet
对应数据库里的一张表
DbSet<Product>= 数据库里的 Products 表- 所有增删改查都通过它操作
4. 迁移(Migration)
自动把 C# 类变成数据库表 不用手动建表、改表,EF Core 自动完成
命令:
dotnet ef migrations add 名字
dotnet ef database update
四、支持的数据库(全覆盖)
EF Core 几乎支持所有数据库:
- SQLite(无需安装,学习首选)
- SQL Server(企业最常用)
- MySQL
- PostgreSQL
- Oracle
- 内存数据库(测试用)
五、完整工作流程(开发标准流程)
1. 安装包
dotnet add package Microsoft.EntityFrameworkCore --version 9.0.3
dotnet add package Microsoft.EntityFrameworkCore.Sqlite --version 9.0.3
dotnet add package Microsoft.EntityFrameworkCore.Tools --version 9.0.3
2. 编写实体类
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public decimal Price { get; set; }
}
3. 编写 DbContext
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<Product> Products => Set<Product>();
}
4. 注册到程序
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlite("Data Source=App.db"));
5. 生成数据库
dotnet ef migrations add InitialCreate
dotnet ef database update
6. 开始操作数据(增删改查)
// 查询
var list = await _context.Products.ToListAsync();
// 新增
_context.Products.Add(new Product { Name = "商品1" });
await _context.SaveChangesAsync();
六、最常用 5 种操作(CRUD)
1. 查询(最常用)
// 查所有
var all = await _context.Products.ToListAsync();
// 根据ID查
var p = await _context.Products.FindAsync(id);
// 条件查询
var cheap = await _context.Products
.Where(p => p.Price < 100)
.ToListAsync();
2. 新增
var product = new Product { Name = "鼠标", Price = 89 };
_context.Products.Add(product);
await _context.SaveChangesAsync();
3. 修改
var p = await _context.Products.FindAsync(id);
p.Price = 99;
await _context.SaveChangesAsync();
4. 删除
var p = await _context.Products.FindAsync(id);
_context.Products.Remove(p);
await _context.SaveChangesAsync();
5. 异步(企业必须用)
所有方法都加 Async
- ToListAsync()
- FindAsync()
- SaveChangesAsync()
七、EF Core 高级功能(企业必备)
1. 数据注解(配置表结构)
public class Product
{
[Key] // 主键
public int Id { get; set; }
[Required] // 不能为空
[MaxLength(50)] // 长度限制
public string Name { get; set; } = string.Empty;
}
2. 关联表(一对多、多对多)
比如:一个分类下有多个商品
public class Category
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public List<Product> Products { get; set; } = new();
}
3. 贪婪加载(Include)
查询时自动加载关联数据
var list = await _context.Categories
.Include(c => c.Products)
.ToListAsync();
4. 分页查询
var page = await _context.Products
.Skip(10) // 跳过10条
.Take(10) // 取10条
.ToListAsync();
5. 原生 SQL 查询
var list = await _context.Products
.FromSql($"SELECT * FROM Products WHERE Price < 100")
.ToListAsync();
八、EF Core 生命周期(三种注入方式)
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlite("..."), ServiceLifetime.Scoped);
- Scoped(默认):一次请求一个实例(最常用)
- Transient:每次使用都新建
- Singleton:全局唯一(极少用)
九、EF Core 高频错误解决
-
找不到 DbContext 解决:没注册 AddDbContext
-
数据库不存在 解决:执行 migration + update
-
数据不生效 解决:忘记写 await SaveChangesAsync()
-
循环引用 解决:加 [JsonIgnore]
十、总结(最重要的 10 点)
- EF Core = .NET 官方数据库 ORM
- 核心:DbContext + DbSet
- 不用写 SQL,用 LINQ
- 用 Migration 自动建表
- 所有操作必须 async/await
- 支持所有主流数据库
- 配合 ASP.NET Core 开发接口
- 可配置:主键、非空、长度、关联
- 企业开发必备技能
- 最新版本:EF Core 9.0(对应 .NET 9)