欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EF--EntityState相互转换

程序员文章站 2022-07-02 12:03:23
EF对数据做什么样的操作,是根据EF的上下文实体状态决定,实体状态有以下5种状态,下面我们就分别看下这5种状态 数据准备,我们看到学生表里有20000名学生记录,最后1位学生的学生编号为0000020000 1、Detached--实体跟上下文压根没关系 我们看到我新创建了名学生,学号为000002 ......
  • ef对数据做什么样的操作,是根据ef的上下文实体状态决定,实体状态有以下5种状态,下面我们就分别看下这5种状态

  数据准备,我们看到学生表里有20000名学生记录,最后1位学生的学生编号为0000020000

EF--EntityState相互转换
1、detached--实体跟上下文压根没关系

我们看到我新创建了名学生,学号为0000020001,他是第20001位学生,此时打印上下文实体状态,实体和上下文是分离状态,没有任何关系,detached是表示连内存跟踪都没有建立,跟上下文dbcontext没有任何关系

student newstudent = new student()
{
  student_id = "0000020001",
  student_name = "猪猪打屁股",
  student_sex = "男",
  student_identity_card = "610102198307122319",
  student_birthday = datetime.now,
  student_email = "menglin2010@126.com",
  student_class = "741903613@qq.com",
  create_time = datetime.now
};
//1、detached--实体跟context压根没关系
{
  using (schooldbentities dbcontext = new schooldbentities())
  {
    console.writeline(dbcontext.entry<student>(newstudent).state);//实体跟context没关系 detached
    newstudent.student_name = "小鱼儿";
    console.writeline(dbcontext.entry<student>(newstudent).state);//detached
    dbcontext.savechanges();//detached啥事儿不发生
  }
}

EF--EntityState相互转换

2、added--添加

我们看到刚开始,newstudent这个学生和上下文是detached分离状态,当把newstudent添加到上下文的students集合里后,再打印newstudent的状态,newstudent就是added状态了,当执行dbcontext.savechange()后,把这个学生添加到表里,最后打印newstudent的状态,发现是unchanged状态,unchanged的意思是上下文和newstudent建立了跟踪,但是newstudent没有发生改变

//2、added--添加
{
  using (schooldbentities dbcontext = new schooldbentities())
  {
    console.writeline(dbcontext.entry<student>(newstudent).state);//detached
    dbcontext.students.add(newstudent);//插入数据(自增主键在插入成功后,会自动赋值过去)
    console.writeline(dbcontext.entry<student>(newstudent).state);//added
    dbcontext.savechanges();
    console.writeline(dbcontext.entry<student>(newstudent).state);//unchanged(跟踪,但是没变化)
  }
}

EF--EntityState相互转换

EF--EntityState相互转换

3、unchanged--跟踪,但是没变化

unchanged就是上下文和实体建立了跟踪,但是实体的值没有发生改变

4、modified--内存clone

把上次添加的那个猪猪打屁股的学生查出来,打印实体状态是unchanged表示上下文建立了跟踪,但是实体未改变,然后修改学生姓名为“猪大头印实体状态是modified,表示实体已发生了修改,当执行dbcontext.savechange()后,把对这个学生的修改保存到表里,最后再打印newstudent的状态,发现是unchanged状态,表示上下文和实体建立了跟踪,但是实体的值没有发生改变

 {
  using (schooldbentities dbcontext = new schooldbentities())
  {
    student currentstudent = dbcontext.students.find("0000020001");//即时查询
    console.writeline(dbcontext.entry<student>(currentstudent).state);//unchanged(跟踪,但是没变化)
    currentstudent.student_name = "猪大头";//修改--内存clone 
    console.writeline(dbcontext.entry<student>(currentstudent).state);//modified
    dbcontext.savechanges();//更新数据库,因为状态是modified
   console.writeline(dbcontext.entry<student>(currentstudent).state);//unchanged(跟踪,但是没变化)
  }
}

EF--EntityState相互转换

EF--EntityState相互转换

 5、deleted--删除

把上次修改的那个“猪大头”的学生查出来,打印其实体状态是unchanged表示上下文建立了跟踪,但是实体未改变,然后从上下文的students集合中移除,再打印实体状态是deleted,表示实体已删除,当执行dbcontext.savechange()后,把这个学生从表里删除掉,最后再打印newstudent的状态,发现是detached状态,表示上下文和实体已经分离,和上下文没有任何关系了

{
  using (schooldbentities dbcontext = new schooldbentities())
  {
    student currentstudent = dbcontext.students.find("0000020001");//即时查询
    console.writeline(dbcontext.entry<student>(currentstudent).state);//unchanged(跟踪,但是没变化)
    dbcontext.students.remove(currentstudent);
    console.writeline(dbcontext.entry<student>(currentstudent).state);//deleted
    dbcontext.savechanges();//删除数据,因为状态是deleted
    console.writeline(dbcontext.entry<student>(currentstudent).state);//detached已经从内存移除了
  }
}

EF--EntityState相互转换

  •  实体和上下文建立跟踪的两种方式

1、查询方式
我们看到通过主键学号为“0000020000”查询出的这个学生实体和上下文建立了跟踪,只不过学生实体值没有发生任何改变,所以实体的状态是unchanged

{
  using (schooldbentities dbcontext = new schooldbentities())
  {
       //1、查询方式
    student currentstudent = dbcontext.students.find("0000020000");
    console.writeline(dbcontext.entry<student>(currentstudent).state);
  }
}

 

EF--EntityState相互转换

2、attach附加方式

修改前学号为0000020000的这名学生叫“石兴江”,性别为“女”,new student()1个学生只不过这个学生的学号是在student表里存在的“0000020000”,打印oldstudent实体状态是detached,跟dbcontext压根没关系,然后把oldstudent附加到上下文中,再打印oldstudent实体状态是unchanged(这里说明下:oldstudent的student_identity_card,student_birthday,student_email等属性是null,难道oldstudent实体状态不应该是modified吗?难道不是把student_identity_card,student_birthday,student_email改为null值吗?这里状态还是unchanged,说明了属性值为null在ef里不是改为null,而是不做更改,最后一张图证明了这点student_identity_card,student_birthday,student_email等属性在表里没有被改为null值),然后修改学号为0000020000的这名学生名称为“石兴江_att”,性别为“男”,再打印oldstudent实体状态是modified(因为实体发生了变化),dbcontext.savechanges();执行后,我们发现0000020000的这名学生名字被改为了“石兴江_att”,性别被改为了“男”,而student_identity_card,student_birthday,student_email等字段值没有被改为null

EF--EntityState相互转换

 

{
  using (schooldbentities dbcontext = new schooldbentities())
  {
    student oldstudent = new student()
    {
      student_id = "0000020000"
    };

    console.writeline(dbcontext.entry<student>(oldstudent).state);//detached--实体跟dbcontext压根没关系
    dbcontext.students.attach(oldstudent);
    console.writeline(dbcontext.entry<student>(oldstudent).state);//unchanged(跟踪,但是没变化)
    oldstudent.student_name = "石兴江_att";
    oldstudent.student_sex = "男";
    console.writeline(dbcontext.entry<student>(oldstudent).state);//modified(因为实体发生了变化)
    dbcontext.savechanges();
  }
}

 EF--EntityState相互转换

  •  按需更新,只更新指定的字段

修改前,学号为“0000000001”的学生名字叫“赵峰真”,身份证号码为"1234567890",我们先查询出学号为“0000000001”的这名学生,打印实体状态为unchanged,表示实体建立了跟踪但是实体未改变,然后修改学生姓名为“赵峰真001”,修改学生身份证号码为“abc”,再打印实体状态为modified(因为实体发生了变化),然后指定这个学生的student_name属性为已修改,指定student_identity_card属性为未被更改过,最后dbcontext.savechanges();后,我们发现只有学生姓名变成了“赵峰真001”  ,而学生身份号码没有被更改为abc“”

EF--EntityState相互转换

//按需更新--只修改指定的字段
{
  using (schooldbentities dbcontext = new schooldbentities())
  {
    student student = dbcontext.students.find("0000000001");//即时查询
    console.writeline(dbcontext.entry<student>(student).state);
    student.student_name = "赵峰真001";
    student.student_identity_card = "abc";
    console.writeline(dbcontext.entry<student>(student).state);
    dbcontext.entry<student>(student).property("student_name").ismodified = true;//指定字段被改过
    dbcontext.entry<student>(student).property("student_identity_card").ismodified = false;//指定字段未被改过
    console.writeline(dbcontext.entry<student>(student).state);
    dbcontext.savechanges();                    
  }
}

EF--EntityState相互转换

EF--EntityState相互转换