Невозможно присоединить сущность, которая уже существует - PullRequest
3 голосов
/ 15 июня 2011

Я получаю эту ошибку всякий раз, когда пытаюсь обновить одну из моих моделей.Обновление довольно простое:

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

И модели имеют такую ​​структуру:

  • У Todo есть Примечание
  • У Todo есть списокЗадачи

У меня 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 в репозитории довольно прост и выглядит так:

Ошибка выдается в этой строке в репозитории: dc.NoteTable.Attach(todo.Note);.Я пробовал много разных вещей, чтобы заставить это работать, но, похоже, ничего не работает.

Любая помощь будет принята с благодарностью

1 Ответ

2 голосов
/ 15 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...