MVC EF如何进行修改操作?

jys1216 2013-01-23 10:08:00
一直想得不是很明白,EF修改操作要怎么写比较好。我看到一些写法如下:

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的时候会报错,说已经存在一个上下文了,纠结。
...全文
2048 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
enginepc 2014-05-19
  • 打赏
  • 举报
回复 1
db.Students.AsNoTracking().Single(x => x.Id ==Id);
http://www.cnblogs.com/charje/archive/2012/02/27/entity_framework_objectstatemanager.html
  • 打赏
  • 举报
回复

public ActionResult ModifyPage(Models.Student model)
{
try
{
DbEntityEntry entry = db.Entry<Models.Student>(model);
entry.State = System.Data.EntityState.Unchanged;
entry.Property("Name").IsModified = true;
entry.Property("CId").IsModified = true;
entry.Property("Gender").IsModified = true;
db.SaveChanges();
return Content("<script>alert('修改成功!');window.location='/Stu/Index'</script>");
}
catch (Exception e)
{
return Content("<script>alert('失败!'" + e.Message + ");window.location='/Stu/Index'</script>");
}
}
夜色镇歌 2013-01-23
  • 打赏
  • 举报
回复

 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();

jys1216 2013-01-23
  • 打赏
  • 举报
回复
报的错不是这个,我刚刚写错代码了, UserInfo oldUserInfo = userInfoService.LoadEntities(u => u.ID == userInfo.ID).FirstOrDefault(); oldUserInfo.ModifiedTime = userInfo.ModifiedTime; userInfoService.UpdateEntity(oldUserInfo); 应该是上样这样的代码,报的错是“无法附加此对象,因为它已经在对象上下文中。对象只有在处于未更改状态时才能重新附加。”
jys1216 2013-01-23
  • 打赏
  • 举报
回复
我写的代码主要如下:

        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(userInfo);
            return Content("ok");
        }
这样就报了“ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”错误,请问怎么解决呢?有好的修改办法吗?
jys1216 2013-01-23
  • 打赏
  • 举报
回复
如果在修改前,重新查一遍数据库,SaveChanges的时候会报错:ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。 请大家指点一下迷津
jys1216 2013-01-23
  • 打赏
  • 举报
回复
最后验证,a346729576是对的,查询的时候这个对象已经Attach过了,所以要去掉,当然,后面两位说的也是对的。
笨笨熊三号 2013-01-23
  • 打赏
  • 举报
回复
引用 楼主 jys1216 的回复:
一直想得不是很明白,EF修改操作要怎么写比较好。我看到一些写法如下: C# code?12345678910111213141516 HBSIEntities entity = new HBSIEntities(); /*更改表的实体,注意在最后加上了“Id=7”, 标识要更改实体表T_UserInfo中Id=7的……
这样

 using (HBSIEntities entity= new HBSIEntities ())
 {
T_UserInfo userinforow=entity.T_UserInfo.FirstOrDefault(t=>t.id==7);//你查出这个实体
if(userinforow==null)
{
return new T_UserInfo();
}
userinforow.NickName = "二师兄";//你的更新的
entity.SaveChanges();//这样就会自动帮你修改
}
webdiyer 2013-01-23
  • 打赏
  • 举报
回复
抱歉,上面的代码错了一个地方,改一下: HBSIEntities entity = new HBSIEntities(); T_UserInfo userinforow =entity.Find(7); //获取原对象 userinforow.NickName = "二师兄"; //更新字段 entity.SaveChanges(); //保存
webdiyer 2013-01-23
  • 打赏
  • 举报
回复
HBSIEntities entity = new HBSIEntities(); T_UserInfo userinforow = new entity.Find(7); //获取原对象 userinforow.NickName = "二师兄"; //更新字段 entity.SaveChanges(); //保存
jys1216 2013-01-23
  • 打赏
  • 举报
回复
引用 4 楼 a346729576 的回复:
C# code?12345678910111213141516 HBSIEntities entity = new HBSIEntities(); /*更改表的实体,注意在最后加上了“Id=7”, 标识要更改实体表T_UserInfo中Id=7的行实体, 为字段重新赋值即可*/ T……
不行中,去掉Attach就更新不了了

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧