C# EF Attach 与 Entry
2022/6/23 5:19:52
本文主要是介绍C# EF Attach 与 Entry,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
先了解一下 EF 框架的 EntityState
在使用EF框架时,
我们通常都是通过调用 SaveChanges() 方法把增加/修改/删除的数据提交到数据库,但是上下文是如何知道实体对象是增加、修改还是删除呢?
答案是通过EntityState的枚举值来判断的。也就是说在操作数据库时,EF会根据EntityState这个枚举检测到实体的状态,然后执行相应的增/删/改操作。
该状态对应的值为以下五种:
Detached:对象存在,但未由对象服务跟踪。在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态;
Unchanged:自对象加载到上下文中后,或自上次调用 System.Data.Objects.ObjectContext.SaveChanges() 方法后,此对象尚未经过修改;
Added:对象已添加到对象上下文,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法;
Deleted:使用 System.Data.Objects.ObjectContext.DeleteObject(System.Object) 方法从对象上下文中删除了对象;
Modified:对象已更改,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法。
Attach() :将给定实体以 System.Data.EntityState.Unchanged 状态附加到上下文中。
从解释可以看出Attach方法主要目的就是把一个没有被 dbContext 跟踪的对象附加到 dbCotext 中使其被 dbContext 跟踪。
Attach执行成功的前提:
1. 如果上下文中已经存在与实体对象键值相同的对象A,则要求实体对象的内存地址必须与对象A相同,否则报错:“已有相同键值的对象存在上下文中......”。
2. 如果上下文中不存在与实体对象键值相同的对象,则要求实体对象的内存地址必须不在上下文中,否则会报错,系统认为在修改键值,这是不允许的。
例如,在删除中使用
public int Delete(T entity) { DB.Set<T>().Attach(entity); DB.Set<T>().Remove(entity); return DB.SaveChanges(); }
Entry() :获取实体对象的代理类
如果实体对象不在当前上下文中(指内存地址),则代理类对象的State为Detached,否则,为上下文中相应所处状态。
例如:在更新中使用
public int Updata(T entity,params string[] propNames) { var oldEntity = DB.Entry(entity); oldEntity.State = EntityState.Unchanged; foreach (var prop in propNames) { oldEntity.Property(prop).IsModified = true; } return DB.SaveChanges(); }
转载于:https://www.cnblogs.com/Aaxuan/p/10041051.html
这篇关于C# EF Attach 与 Entry的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID
- 2024-01-23用CI/CD工具Vela部署Elasticsearch + C# 如何使用
- 2024-01-23.NET开源的简单、快速、强大的前后端分离后台权限管理系统