EF中会为每个 管理的 实体对象 创建一个代理包装类对象,其中会跟踪 实体对象 的状态和每个属性的状态;
一、通常使用EF更新的方式,先查询出要修改的数据,然后再修改新的值;实体对象被修改的属性 在 代理包装类对象里 的对应属性状态会被修改记录下修改状态,等到调用SaveChanges时,EF会遍历其管理的每个实体对象,并根据其 包装类对象 的状态,生成增删改查sql语句并执行;
此例中修改操作,会生成 修改的sql语句(注意:此处只为修改过的属性生成sql语句),最后执行。
缺点:修改先还要查询,难受~~~~
//T_TEST2(ID,NAME)
////edit 先查询再修改
EFDBReferenceEntities EFDB = new EFDBReferenceEntities();
T_TEST2 t2 = new T_TEST2();
t2.ID = 5;
T_TEST2 temp = EFDB.T_TEST2.Where(u => u.ID == t2.ID).FirstOrDefault();
temp.NAME = "YYYY";
EFDB.SaveChanges();
//edit 直接修改,不需查询
EFDBReferenceEntities EFDB = new EFDBReferenceEntities();
T_TEST2 t2 = new T_TEST2();
t2.ID = 5;
t2.NAME = "HHHHH";
//1 添加到管理容器中,并获得沩包装类对象
DbEntityEntry<T_TEST2> entry = EFDB.Entry<T_TEST2>(t2);
//如果使用entry附加实体对象的数据容器中,则需手动设置 实体包装类的对象 的状态为unchanged
//如果使用attach就不需要这句
entry.State = EntityState.Unchanged;
//2 标识实体对象的某些属性已经被修改
entry.Property("NAME").IsModified = true;
//3 更新到数据库
EFDB.SaveChanges();