Entity Framework Core 通过 DbSet 和 DbContext 配合异步方法实现 CRUD,无需手写 SQL;需注意上下文生命周期、实体状态及显式调用 SaveChangesAsync 才能持久化。

Entity Framework Core 执行增删改查(CRUD)核心靠 DbSet 和 DbContext 配合异步方法完成,不需要手写 SQL,但需注意上下文生命周期、实体状态和保存时机。
创建实体与数据库上下文
先定义一个简单模型类(如 Product),再继承 DbContext 创建上下文类:
- 实体类中主键建议用
[Key]显式标注,或按命名约定(如Id或ProductId)自动识别 - 上下文类中声明
DbSet属性,EF Core 会自动映射为数据表 - 若需精细控制字段(长度、是否为空、列名等),可用数据注解(
[Required]、[MaxLength(100)]、[Column("product_name")])或 Fluent API 配置
注册并初始化 DbContext
在 ASP.NET Core 中,必须将上下文注册进 DI 容器,并指定数据库提供程序:
- 在
Program.cs(.NET 6+)中调用builder.Services.AddDbContext(opt => opt.UseSqlServer(connStr)) - 连接字符串写在
appsettings.json的ConnectionStrings节点下 - 控制台或非 Web 场景可直接 new 上下文,但需手动传入
DbContextOptions
执行增删改查操作
所有操作都通过 DbContext 实例的 DbSet 属性发起,推荐使用异步方法(ToListAsync、SaveChangesAsync 等):
-
查(Read):用 LINQ 查询,如
context.Products.Where(p => p.Price > 100).ToListAsync();主键查询优先用FindAsync(id)(性能更好,且会检查本地缓存) -
增(Create):调用
context.Products.Add(entity)或AddRange,再执行await context.SaveChangesAsync() -
删(Delete):可用
context.Products.Remove(entity)(实体已加载),或先FindAsync再删;也可用“仅主键实体”方式:context.Products.Attach(new Product { Id = 123 }); context.Products.Remove(entity); -
改(Update):最安全方式是先查出来,改属性,再
SaveChangesAsync;若只想更新部分字段,可用Entry(entity).Property(e => e.Name).IsModified = true显式标记
注意事务与上下文作用域
单次 SaveChangesAsync 默认自带事务,多个操作需原子性时可显式使用 Database.BeginTransaction();Web 应用中,推荐每个请求一个上下文(Scoped 生命周期),避免跨请求复用或长时间持有。
基本上就这些。不复杂但容易忽略细节,比如没调 SaveChangesAsync 就以为数据已入库,或者 Attach 后状态没设对导致更新失败。










