在不同的ObjectContext中更新数据

第一个using中获取一些数据

User u;
using (var db = new Entities())
{
    u = db.Users.First();
}

在using外改变

u.NickName += "ABC";

在第二个using中把改变更新到库

using (var db = new Entities())
{
    ……
    db.SaveChanges();    
}

在网上看了一些使用ApplyPropertyChanges()做的(此方法已过时,被标记为Browsable(false),可以使用新的ApplyCurrentValues),不过在apply之前,要先从库里把要改变的数据查出来(通过EntityKey查)这样会增加一次读库操作

保存的是这个刚查出来的,而不是之前上下文查出来的。


可以使用Attach附加,但是附加之后状态会变成Unchanged

这个时候需要手动改state,不能直接改,只有get没有set

db.ObjectStateManager.ChangeObjectState(obj, EntityState.Modified);
要通过state manager改。
改后save即可
用apply的方式
  1: using (var db = new Entities())
  2: {
  3:     Console.WriteLine("到第二个上下文中" + u.EntityState + "," + u.NickName);
  4: 
  5:     var u2 = db.GetObjectByKey(u.EntityKey) as User;
  6:     Console.WriteLine("在第二个中查出" + u.EntityState + ",1:" + u.NickName);
  7:     Console.WriteLine("在第二个中查出" + u2.EntityState + ",2:" + u2.NickName);
  8: 
  9:     db.Users.ApplyCurrentValues(u);
 10:     Console.WriteLine("在第二个中apply" + u.EntityState + ",1:" + u.NickName);
 11:     Console.WriteLine("在第二个中apply" + u2.EntityState + ",2:" + u2.NickName);
 12: 
 13:     db.SaveChanges();
 14:     Console.WriteLine("保存后" + u.EntityState + ",1:" + u.NickName);
 15:     Console.WriteLine("保存后" + u2.EntityState + ",2:" + u2.NickName);
 16: }
image 

用attach的方式
  1: using (var db = new THZlocalEntities())
  2: {
  3:     db.Attach(u);
  4:     Console.WriteLine("附加后" + u.EntityState + "," + u.NickName);
  5: 
  6:     db.ObjectStateManager.ChangeObjectState(u, EntityState.Modified);
  7:     Console.WriteLine("改变状态" + u.EntityState + "," + u.NickName);
  8: 
  9:     db.SaveChanges();
 10: 
 11:     Console.WriteLine("保存" + u.EntityState + "," + u.NickName);
 12: 
 13: }
image 

posted @ 2011-09-30 11:05  czcz1024  阅读(284)  评论(0编辑  收藏  举报