2012-03-14 13 views
0

私は古いデータを実際に保存することができます[投稿]編集?"編集"アクション、古いデータを保存する

私はこれらの二つのモデルがあります:私は、タスクを作成するとき

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.sheet_length * Task.sheets_num *タスクを - - Spool.Weightは Task.Spool.Weight = Task.Spool.Weightを変更します。 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 } 

私はあなたが新しいタスクを添付する際に問題が発生し

+0

を私はこの仕事わからないんだけど、あなただけの 'task'、その後' SaveChanges'で変更した値で 'taskOld'を更新できませんでしたか? –

+0

あなたが一目瞭然ではないことを読み返して、古いタスクを保持して編集中に新しいタスクを挿入しようとしていますか?あなたの質問は、今私がそれを読んだので、それはそのように聞こえる。 – Leniency

答えて

1

(それは同じキーを持つオブジェクトいる)ObjectStateManagerエラーを取得します。

両方とも同じIDを持ち、ObjectStateManagerは同じIDを持つ同じオブジェクトの2つをトラッキングできません。代わりに、個別のプロパティを割り当てるので、あなたはUpdateModel(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 }); 
} 

または:

より正常なアプローチがtaskOldにタスクの入力をマッピングすることです。

0

あなたはリニエンシーコード、または以下のことができます。

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