2012-03-14 75 views
0

我如何保存旧数据的操作[post]编辑?“编辑”操作,保存旧数据

我有这两种模式:

public class Task 
{ 
    public int ID { get; set; } 
    public int sheet_length { get; set; } 
    public int sheets_num { get; set; } 

    [Required] 
    public int spoolID { get; set; } 

    [ForeignKey("spoolID")] 
    public virtual Spool Spool { get; set; } 
} 

public class Spool 
{ 
    public int ID { get; set; } 
    public string name { get; set; } 
    public int weight { get; set; } 
    public int weight_meter { get; set; } 
    public virtual ICollection<Task> Tasks { get; set; } 
} 

当我创建任务 - Spool.Weight改变 Task.Spool.Weight = Task.Spool.Weight - (Task.sheet_length * Task.sheets_num *任务。 Spool.weight_meter)

当我编辑的任务 - 我想这样做:

TaskOld.Spool.Weight = TaskOld.Spool.Weight + (TaskOld.sheet_length * TaskOld.sheets_num * TaskOld.Spool.weight_meter) 

Task.Spool.Weight = Task.Spool.Weight - (Task.sheet_length * Task.sheets_num * Task.Spool.weight_meter) 

但是,当我试图让在编辑操作的旧数据

[HttpPost] 
public ActionResult Edit(Task task) 
{ 
    if (ModelState.IsValid) 
    { 
     taskOld = dbContext.Tasks.Single (t => t.ID == task.ID); 

     ////some code 

     db.Tasks.Attach(task); 
     db.SaveChanges(); 
     return RedirectToAction("Index", "Task", new { id = task.orderID }); 
    } 
///some code } 

我得到一个错误ObjectStateManager(它使用相同的密钥对象)

+0

我不知道这样的工作,但不能你只是在'task'更新'taskOld'与改变的值,然后'SaveChanges'? – 2012-03-14 14:11:32

+0

回头看,有一件事你根本就不清楚 - 你是否试图在编辑过程中保留旧任务并插入新任务?现在你的问题听起来像是我重读了它。 – Leniency 2012-03-14 14:49:38

回答

1

出现的问题,当你装上新的任务。

if (ModelState.IsValid) 
{ 
    taskOld = dbContext.Tasks.Single (t => t.ID == task.ID); 

    ////some code 

    // Error here! db.Tasks already contains something for the Id 
    // Can't have two tasks with the same Id. Attach doesn't update the 
    // existing record, but adds the 'task' to the object graph for tracking. 
    db.Tasks.Attach(task); 

    db.SaveChanges(); 
    return RedirectToAction("Index", "Task", new { id = task.orderID }); 
} 

都具有相同的ID和ObjectStateManager无法跟踪两次与同一ID同一对象的。

一个比较正常的方法是将任务输入映射到taskOld:

if (ModelState.IsValid) 
{ 
    taskOld = dbContext.Tasks.Single (t => t.ID == task.ID); 

    // ... Some code ... 

    // taskOld is already attached to the DbContext, so just map the updated 
    // properties. 
    taskOld.Property1 = task.Property1; 
    taskOld.Property2 = task.Property2; 
    ... 

    db.SaveChanges(); 
    return RedirectToAction("Index", "Task", new { id = task.orderID }); 
} 

或者,而不是单独指定属性,你可以调用UpdateModel(taskOld),它会试图做同样的事情。

0

可以从宽如下代码,或:

[HttpPost] 
public ActionResult Edit(Task t) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(t).State = EntityState.Modified; 
     db.SaveChanges(); 
    } 
    return View(t); 
}