第一个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: }
用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: }