状态跟踪
主要是描述需要修改数据的的对应的实体做一个管控;描述实体对象和Context之间的关系;
做的增删改---都是在摸一个命令以后,维护当前的实体对象和Context之间的关系,当有Savechanges执行的之后,就根据状态去落实到数据库中去;
主要有 5 个状态
Detached, 一切实体操作都是无效的
Unchanged, 有关系,没有任何操作
Deleted, 有关系,已经发出了删除的指令
Modified, 有关系,已经发出了修改的指令
Added, 有关系,已经发出了新增的指令
public static void Show() { { using (CustomerDbContext context = new CustomerDbContext()) { Console.WriteLine("********添加*********"); //准备要添加的数据 var addData = new Company() { CompanyName = "阿里,武汉分公司", CreateTime = DateTime.Now, CreatorId = 1, LastModifierId = 1, LastModifyTime = DateTime.Now }; Console.WriteLine("********Add之前*********"); Console.WriteLine(context.Entry<Company>(addData).State);// Add之前没有任何操作 Detached 没有跟踪-- 对于这个实体做的任何操作都是无法落地到数据库中去的; addData.CompanyName = "1234"; context.SaveChanges(); context.Companies.Add(addData); //给定一个添加的命令 Console.WriteLine("********Add之后*********"); Console.WriteLine(context.Entry<Company>(addData).State); context.SaveChanges(); //开始添加 Console.WriteLine("********Add之后--SaveChanges后*********"); Console.WriteLine(context.Entry<Company>(addData).State); // Unchanged 跟踪-- 没有任何操作 Console.WriteLine("********查询*********"); Company company = context.Companies.OrderByDescending(c => c.CompanyId).FirstOrDefault(); //给定一个查询的命令 Console.WriteLine("********查询得到的实体*********"); Console.WriteLine(context.Entry<Company>(company).State); // Unchanged 跟踪-- 没有任何操作 Console.WriteLine("********修改*********"); company.CompanyName = "阿里,武汉分公司--高级进阶专属办事处"; Console.WriteLine("********修改某个属性之后*********"); Console.WriteLine(context.Entry<Company>(company).State); //Modified, 有关系,已经发出了修改的指令 //并没有看到一个Update 命令 context.SaveChanges(); //落实到数据库 Console.WriteLine("********Add之后--SaveChanges后*********"); Console.WriteLine(context.Entry<Company>(company).State); // Unchanged 跟踪-- 没有任何操作 context.Companies.Remove(company); //删除命令的 Console.WriteLine("********Remove命令之后*********"); Console.WriteLine(context.Entry<Company>(company).State); //Deleted, 有关系,已经发出了删除的指令 context.SaveChanges(); //落实到数据库 Console.WriteLine("********Remove命令之后--SaveChanges之后*********"); Console.WriteLine(context.Entry<Company>(company).State); // Unchanged 跟踪-- 没有任何操作 } } }
启用跟踪和断掉跟踪 一般也就用这2个,如果对数据只是查询可以断掉跟踪提升性能
1 2 | Company company = context.Companies.OrderByDescending(c => c.CompanyId).FirstOrDefault(); Company company2 = context.Companies.AsNoTracking().FirstOrDefault(); //性能更高 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //修改一个字段的数据,就要去维护这状态; 查询--状态其实没用--增删改--状态才有价值; //场景:查询--就知道不需要针对于当前这个对象做增删改--状态跟踪---没有必要--状态跟踪--内部实现是通过,克隆一个副本来完成----占内存; //也可以设置全局查询不跟踪状态: //this.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; //this.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll; //设置当前Context上下文查询不跟踪状态 context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; //设置当前Context上下文查询跟踪状态 context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll; Company company3 = context.Companies.FirstOrDefault(); Console.WriteLine(context.Entry<Company>(company3).State); //状态为Detached |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现