首页 新闻 会员 周边

MVC EF如何进行修改操作呢?

0
悬赏园豆:20 [已解决问题] 解决于 2013-01-23 16:06

一直想得不是很明白,EF修改操作要怎么写比较好。我看到一些写法如下:

View Code
      HBSIEntities entity = new HBSIEntities();
            /*更改表的实体,注意在最后加上了“Id=7”,
             标识要更改实体表T_UserInfo中Id=7的行实体,
             为字段重新赋值即可*/
            T_UserInfo userinforow = new T_UserInfo()
            {
                UserName = "zbj",
                Pwd = "234567",
                NickName = "二师兄",
                Address = "高老庄",
                Sfzh = "123452223333444423",
                Id=7
            };
            entity.T_UserInfo.Attach(userinforow);
            entity.ObjectStateManager.ChangeObjectState(userinforow,EntityState.Modified);
            entity.SaveChanges();

但这样写的话,更改实体时,所有字段都要赋值,如我们本来只想为NickName属性改变之为”二师兄“,其余字段的值并不像更改,但仍然需要为其余字段赋上原值,否则更新到数据库中后,字段的值会成为NulL。如果我只想修改用户的密码,就很麻烦拉,因为不知道其它的值呀。

如果在修改前,重新查一遍数据库,SaveChanges的时候会报错,“无法附加此对象,因为它已经在对象上下文中。对象只有在处于未更改状态时才能重新附加。”

我的写法是:

View Code
        public T UpdateEntity(T entity)
        {
            if (entity != null)
            {
                db.CreateObjectSet<T>().Attach(entity);
                db.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
            }
            return entity;
        }

        [HttpPost]
        public ActionResult EditUserInfo(UserInfo userInfo)
        {
            UserInfo oldUserInfo = userInfoService.LoadEntities(u => u.ID == userInfo.ID).FirstOrDefault();
            oldUserInfo.ModifiedTime = userInfo.ModifiedTime;
            userInfoService.UpdateEntity(oldUserInfo);
            return Content("ok");
        }

请问怎么解决呢?有好的修改办法吗? 恳请大家给点意见。

jiangys的主页 jiangys | 初学一级 | 园豆:143
提问于:2013-01-23 14:28
< >
分享
最佳答案
0

传实体参数的话,CodeFirst用

db.Entry<TEntity>(entity).State = EntityState.Modified;

 

不是 CodeFirst,可以用 ApplyCurrentValues

  db.CreateObjectSet<T>().ApplyCurrentValues(entity);
  db.SaveChanges();

收获园豆:15
Qlin | 老鸟四级 |园豆:2403 | 2013-01-23 15:16
其他回答(2)
0

没看明白你的代码,反正修改起来很简单:

using(YourDbContext dbContext = new YourDbContext())

{

      var userInfo = dbContext.UserInfos.SingleOrDefault(o=>o.ID == "dfdf");

       userInfo.ModifiedTime = DateTime.Now;

      dbContext.SaveChanges();
}

收获园豆:5
Launcher | 园豆:45045 (高人七级) | 2013-01-23 14:32

我的页面已经传一个model过来了,当然,这个MOdel不是所有的字段。所以要在数据库里先查一个oldModel出来,再赋值这样的

View Code
        public ActionResult EditUserInfo(UserInfo userInfo)
        {
            UserInfo oldUserInfo = userInfoService.LoadEntities(u => u.ID == userInfo.ID).FirstOrDefault();
            oldUserInfo.ModifiedTime = userInfo.ModifiedTime;
            userInfoService.UpdateEntity(oldUserInfo);
            return Content("ok");
        }

但报错,“无法附加此对象,因为它已经在对象上下文中。对象只有在处于未更改状态时才能重新附加。”

支持(0) 反对(0) jiangys | 园豆:143 (初学一级) | 2013-01-23 14:41

@Jyson: 修改对象不能附加,是读取出来后,修改完属性再保存:

UserInfo oldUserInfo = userInfoService.LoadEntities(u => u.ID == userInfo.ID).FirstOrDefault();
oldUserInfo.ModifiedTime = userInfo.ModifiedTime;

db.SaveChanges();

大概看了下你的源码,我认为应该这样(也就是说你的UpdateEntity代码使用EF的方式不对):

var users = db.CreateObjectSet<UserInfo>();

UserInfo oldUserInfo = users.SingleOrDefault(u => u.ID == userInfo.ID);

oldUserInfo.ModifiedTime = userInfo.ModifiedTime;

db.SaveChanges();

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2013-01-23 14:45
0
 HBSIEntities entity = new HBSIEntities();
            /*更改表的实体,注意在最后加上了“Id=7”,
             标识要更改实体表T_UserInfo中Id=7的行实体,
             为字段重新赋值即可*/
            T_UserInfo userinforow = new T_UserInfo()
            {
                UserName = "zbj",
                Pwd = "234567",
                NickName = "二师兄",
                Address = "高老庄",
                Sfzh = "123452223333444423",
                Id=7
            };
            entity.T_UserInfo.Attach(userinforow); //////这句去掉  因为你查询的时候这个对象已经Attach过了
            entity.ObjectStateManager.ChangeObjectState(userinforow,EntityState.Modified);
            entity.SaveChanges();

问题解决了,如果要查询的话,得去掉Attach,呵呵,谢谢大家

jiangys | 园豆:143 (初学一级) | 2013-01-23 16:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册