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来处理的

浙公网安备 33010602011771号