EFCore——Entry和Attach
一、Dbcontext.Entry
ChangeTracker是Entity Framework Core记录实体变更的核心对象(这一点和以前版本的Entity Framework一致)。当你使用Entity Framework Core进行获取实体对象、添加实体对象、删除实体对象、更新实体对象、附加实体对象等操作时,ChangeTracker都会记录下来对应的实体引用和对应的实体状态。
1.实体保存逻辑(SaveChanges())
Entry() :获取实体对象的代理类
SaveChanges() 方法把增加/修改/删除的数据提交到数据库,但是上下文是如何知道实体对象是增加、修改还是删除呢?
答案是通过EntityState的枚举值来判断的。也就是说在操作数据库时,EF会根据EntityState这个枚举检测到实体的状态,然后执行相应的增/删/改操作。
2.状态枚举类型(EntityState)
- Detached:
对象存在,但未由对象服务跟踪。在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态;- Unchanged:此对象尚未经过修改;
- Added:对象已添加到对象上下文,但尚未调用
- Deleted:从对象上下文中删除了对象;
- Modified:对象已更改,但尚未调用
3.示例
//DbContext.Entry(entity)获取代理类entity
//.State设置他的状态
//EntityState.Modified;设值追踪状态为修改
DbContext.Entry(entity).State = EntityState.Modified;
//保存实体,在数据库中执行修改命令
DbContext.SaveChanges()
二、Attach
将给定实体以 System.Data.EntityState.Unchanged 状态附加到上下文中。
从解释可以看出Attach方法主要目的就是把一个没有被 dbContext 跟踪的对象附加到 dbCotext 中使其被 dbContext 跟踪。
public void Update(Product product)
{
using(Entities ctx = new Entities)
{
//product 已前台更新后
ctx.Attach(product);
ctx.ObjectStateManager.ChangeObjectState(entity,EntityState.Modified)
ctx.SaveChange();
}
}
//EF 的处理方式如下
// 1 把对象附加到上下文中,并把状态改为Modified状态
// 2 调用Savechange方法时生成一段Update的SQL语句且Where 条件// 为对象的主键Id,因为EF更新和删除都是根据主键ID来处理的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!