2011-06-15 90 views
3

每當我嘗試更新我的某個模型時,都會出現此錯誤。更新很簡單:無法附加已存在的實體

Todo bn = service.GetTodos().Single(t => t.todoId == 1); 
bn.Note.noteTitle = "Something new"; 
service.SaveTodo(bn); 

而且車型有這種結構:

  • 待辦事項有備註
  • 待辦事項有任務

我的列表我的服務的SaveTodo看起來有點像這樣:

public void SaveTodo (TodoWrapper note) 
{ 
    using (Repository repo = new Repository(new HpstrDataContext())) 
    { 
     if (note != null) 
     { 
      Todo todo = repo.Todos.SingleOrDefault(t => t.todoId == note.todoId); 
      if (todo == null) 
      { 
       todo = new Todo(); 
       todo.Note = new Note(); 
      } 
      todo.dueDate = note.dueDate; 
      todo.priority = (short)note.priority; 

      todo.Note.isTrashed = note.Note.isTrashed; 
      todo.Note.permission = (short)note.Note.permission; 
      todo.Note.noteTitle = note.Note.noteTitle; 

      repo.SaveTodo(todo); 
     } 
    } 
} 

和存儲庫的SaveTodo方法很簡單,看起來像這樣:

public void SaveTodo (Todo todo) 
{ 
    if (todo.Note.noteId == 0) 
    { 
     dc.NoteTable.InsertOnSubmit(todo.Note); 
    } else 
    { 
     dc.NoteTable.Attach(todo.Note); 
     dc.NoteTable.Context.Refresh(RefreshMode.KeepCurrentValues , todo.Note); 
    } 
    if (todo.todoId == 0) 
    { 
     dc.TodoTable.InsertOnSubmit(todo); 
    } else 
    { 
     dc.TodoTable.Attach(todo); 
     dc.TodoTable.Context.Refresh(RefreshMode.KeepCurrentValues , todo); 
    } 
    dc.SubmitChanges(); 
} 

誤差以這條線在庫被拋出:dc.NoteTable.Attach(todo.Note);。我已經嘗試了很多不同的東西來使這個工作,但似乎沒有任何工作。

任何幫助,將不勝感激

回答

2

所以,我解決了這個問題(希望)。在我的倉庫,我改變了SaveTodo看起來像這樣

public void SaveTodo (TodoWrapper note) 
{ 
    using (Repository repo = new Repository(new HpstrDataContext())) 
    { 
     if (note != null) 
     { 
      Todo todo = repo.Todos.SingleOrDefault(t => t.todoId == note.todoId); 
      if (todo == null) 
      { 
       todo = new Todo(); 
       todo.Note = new Note(); 
      } 
      todo.dueDate = note.dueDate; 
      todo.priority = (short)note.priority; 
      todo.Note.isTrashed = note.Note.isTrashed; 
      todo.Note.permission = (short)note.Note.permission; 
      todo.Note.noteTitle = note.Note.noteTitle; 
      foreach (TaskWrapper item in note.Tasks) 
      { 
       Task t = repo.Tasks.SingleOrDefault(task => task.tasksId == item.taskId); 
       if (t == null) 
       { 
        t = new Task(); 
       } 
       t.Todo = todo; 
       t.isCompleted = item.isCompleted; 
       t.content = item.content; 
       repo.SaveTask(t); 
      } 
     } 
    } 
} 

如果有人想知道,作爲包裝的包裝(沒辦法)與WCF的實體。

而且我保存任務是這樣的:

public void SaveTask (Task task) 
{ 
    if (task.tasksId == 0) 
    { 
     dc.TaskTable.InsertOnSubmit(task); 
    } else 
    { 
     dc.TaskTable.Context.Refresh(RefreshMode.KeepCurrentValues , task); 
    } 
    dc.SubmitChanges(); 
} 

我擺脫了安裝,因爲我調用單個或默認的語句時,那麼它已經連接到數據庫已經拔出的Todo。所以錯誤是正確的,因爲這個實體已經連接到數據庫。 如果我已經做了一個新的Todo而不是將數據庫中的數據抓取出來,那麼附件就可以工作。希望這有助於任何人在這個絆倒

相關問題