2012-02-07 5 views
1

Я работаю над приложением WP7 mango, которое использует Linq2SQL для доступа к данным. У меня есть объект Note, у которого есть Auto сгенерированный ключ типа int.Выполнение DeleteOnSubmit(), SubmitChanges(), InsertOnSubmit(), SubmitChanges() не работает (выбрасывает Entity уже существует Исключение)!

В первый раз, когда я добавляю новое примечание к db, операция отлично работает, записка сохраняется, а затем, если я удалю ее из db, она также удаляется из db. Первая сущность всегда равна Id = 0.

Тогда, если я хочу добавить новую заметку после удаления первой заметки, я получаю исключение, говорящее, что объект уже существует. Я пришел к выводу, что первая сущность с Id = 0 не была удалена, хотя я назвал SubmitChanges в моем контексте данных.

Кроме того, я использую тот же контекст данных для операций с данными в моем репозитории и в том же экземпляре репозитория (один сингл по соображениям производительности). Чтобы подтвердить это поведение, я попытался выполнить последовательность вызовов, и это не удалось !!!

this.DbContext.Notes.DeleteOnSubmit(value); 
this.DbContext.SubmitChanges(); 
this.DbContext.Notes.InsertOnSubmit(value); 
this.DbContext.SubmitChanges(); 

В нем говорится, что он не может добавить Сущность, которая уже существует. Любые объяснения этого поведения? Спасибо заранее.

Примечание: Когда я использую два разных экземпляра контекста данных, это поведение исчезает.

ответ

5

Хорошо Вы ответили на свой вопрос, действительно, в конце. Давайте пошагово это:

  1. Вы получаете DbContext из базы данных
  2. Ваш Удаление записи и представления базы данных (ОК штраф)
  3. Теперь на этой вставке ваше использование старого экземпляра базы данных.

Everytime вы делаете

SubmitChanges(); 

Вы должны обновить вашу ссылку, так как его старый.

Итак, если у вас есть метод, который выполняет несколько транзакций, вам НЕОБХОДИМО обновить локальную переменную.

ONE экземпляр базы данных должен сделать ONE изменения