Entity Framework Core怎么执行增删改查 EF Core CRUD操作方法

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

Entity Framework Core 执行增删改查(CRUD)核心靠 DbSetDbContext 配合异步方法完成,不需要手写 SQL,但需注意上下文生命周期、实体状态和保存时机。

创建实体与数据库上下文

先定义一个简单模型类(如 Product),再继承 DbContext 创建上下文类:

  • 实体类中主键建议用 [Key] 显式标注,或按命名约定(如 IdProductId)自动识别
  • 上下文类中声明 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.jsonConnectionStrings 节点下
  • 控制台或非 Web 场景可直接 new 上下文,但需手动传入 DbContextOptions

执行增删改查操作

所有操作都通过 DbContext 实例的 DbSet 属性发起,推荐使用异步方法(ToListAsyncSaveChangesAsync 等):

  • 查(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 后状态没设对导致更新失败。