请帮助
这就是我正在更新....
[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(...)......比它不适合我,它也没有显示任何错误
答案 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);
}