«Редактировать» действие, сохранить старые данные - PullRequest
0 голосов
/ 14 марта 2012

Как я могу сохранить старые данные в действии [post] Edit?

У меня есть две модели:

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; }
}

Когда я создаю Task - Spool.Weight меняет Task.Spool.Вес = Task.Spool.Weight - (Task.sheet_length * Task.sheets_num * Task.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 (у нее есть объект с тем же ключом)

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Проблема возникает, когда вы присоединяете новую задачу.

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

Оба имеют один и тот же идентификатор, и ObjectStateManager не может отслеживать два одинаковых объекта с одинаковым идентификатором.

Более нормальный подход - сопоставить входные данные Task с 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 голосов
/ 14 марта 2012

Вы можете следовать коду Лентности, или:

[HttpPost]
public ActionResult Edit(Task t)
{
    if (ModelState.IsValid)
    {
        db.Entry(t).State = EntityState.Modified;
        db.SaveChanges();
    }
    return View(t);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...