Entity Framework Core 执行增删改查(CRUD)核心靠 DbSet 和 DbContext 配合异步方法完成,不需要手写 SQL,但需注意上下文生命周期、实体状态和保存时机。
创建实体与数据库上下文
先定义一个简单模型类(如
Product),再继承
DbContext创建上下文类: 实体类中主键建议用
[Key]显式标注,或按命名约定(如
Id或
ProductId)自动识别 上下文类中声明
DbSet<t></t>属性,EF Core 会自动映射为数据表 若需精细控制字段(长度、是否为空、列名等),可用数据注解(
[Required]、
[MaxLength(100)]、
[Column("product_name")])或 Fluent API 配置
注册并初始化 DbContext
在 ASP.NET Core 中,必须将上下文注册进 DI 容器,并指定数据库提供程序:
在Program.cs(.NET 6+)中调用
builder.Services.AddDbContext<appdbcontext>(opt => opt.UseSqlServer(connStr))</appdbcontext>连接字符串写在
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 后状态没设对导致更新失败。
