2011-06-15 71 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而不是将数据库中的数据抓取出来,那么附件就可以工作。希望这有助于任何人在这个绊倒

相关问题