Так что я решил проблему (надеюсь). В моем репозитории я изменил 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();
}
Я избавился от Attach, потому что я уже извлекал Todo при вызове оператора single или по умолчанию, поэтому он уже был присоединен к базе данных. Таким образом, ошибка была правильной, потому что этот объект уже был присоединен к базе данных.
Если бы я сделал новый Todo вместо того, чтобы вытащить один из базы данных, присоединение сработало бы. Надеюсь, что это поможет любому, кто наткнется на это