使用EF更新操作在MVC5中不起作用

时间:2016-07-23 05:13:05

标签: asp.net-mvc entity-framework

请帮助

  

这就是我正在更新....

    [HttpPost, ActionName("Edit")]
      public ActionResult Edit(Students model)
       {
        if (ModelState.IsValid)
        {
            using (DbAccess db = new DbAccess())
            {

              var ID=db.students.Find(model.id);
              db.Entry(ID).State = EntityState.Modified;
              //ID.name = model.name;
              //ID.address = model.address;
              //ID.age = model.age;
              //ID.email = model.email;
              //ID.isActive = model.isActive;

                db.SaveChanges();
            }
        }

        return View(model);
    }
  

在上面的代码中,当我单独更新比它运行良好,但当我使用db.Entry(...)......比它不适合我,它也没有显示任何错误

3 个答案:

答案 0 :(得分:0)

只需替换它:

db.Entry(ID).State = EntityState.Modified;
              //ID.name = model.name;
              //ID.address = model.address;
              //ID.age = model.age;
              //ID.email = model.email;
              //ID.isActive = model.isActive;

with:

UpdateModel(ID);

你会没事的;

为了使您的方法有效,您需要这样做:

db.Students .Attach(ID);

var entry = db.Entry(ID);
entry.State = EntityState.Modified;

entry.Property(x => x.name).IsModified = true;
entry.Property(x => x.address).IsModified = true;   
....
db.SaveChanges(); 

基本上你需要附加更新的模型然后告诉上下文,哪些道具被修改。

我在我的存储库中,我在某些情况下使用的另一种方法,当在控制器中没有完成更新时,方法是:

 public void Update(TEntity newEntity)
 {
     var oldEntity = Context.Set<TEntity>().Find(newEntity.Id);

     Context.Entry(oldEntity).CurrentValues.SetValues(newEntity); 
 }

在此方法中,newEntity从视图中传出,oldEntity来自上下文。

UpdateModel只能在控制器中使用,当我在控制器外调用更新时,我使用上面的方法。我更喜欢这种方法,因为我不需要明确告诉哪些道具被修改了。当你有一个包含10个道具的表单,并且用户只更新3或4时,你需要很多逻辑来确定哪些被修改。

PS - 我的实体都在实现IEntityId,这是一个具有公共属性的接口,如Id,UpdateDate,InsertDate ......,这就是我可以调用newEntity.Id

的原因

答案 1 :(得分:0)

当您执行var ID=db.students.Find(model.id);

您不需要使用 db.Entry(ID).State = EntityState.Modified;

因为当您执行Find时,您拥有dbContext的真实对象,当您对其进行更改时(当然主键除外),您的SaveChanges将检测到它并相应地更新它。

只有当你做这样的事情时才需要设置State

Students students = new Students(); //a new object which is not created using `Find`
students.name = "Heartlion";
students.address = "address text";

db.Entry(students).State = EntityState.Modified;
db.SaveChanges();

答案 2 :(得分:0)

你可以试试......

[HttpPost, ActionName("Edit")]
        public ActionResult Edit(Students model)
        {
            if (ModelState.IsValid)
        {
                using (DbAccess db = new DbAccess())
        {

                  var ID = db.students.Find(model.id);
        //db.Entry(ID).State = EntityState.Modified;
        ID.name = model.name;
        ID.address = model.address;
        ID.age = model.age;
        ID.email = model.email;
        ID.isActive = model.isActive;

        db.SaveChanges();
        }
        }

        return View(model);
        }