状态跟踪

   主要是描述需要修改数据的的对应的实体做一个管控;描述实体对象和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个,如果对数据只是查询可以断掉跟踪提升性能

  Company company = context.Companies.OrderByDescending(c => c.CompanyId).FirstOrDefault();
  Company company2 = context.Companies.AsNoTracking().FirstOrDefault();//性能更高 

  

//修改一个字段的数据,就要去维护这状态; 查询--状态其实没用--增删改--状态才有价值;
                            //场景:查询--就知道不需要针对于当前这个对象做增删改--状态跟踪---没有必要--状态跟踪--内部实现是通过,克隆一个副本来完成----占内存;

                           

                            //也可以设置全局查询不跟踪状态:
                            //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

  

posted @ 2022-02-09 12:08  wolfsocket  阅读(67)  评论(0编辑  收藏  举报