Выполнение DeleteOnSubmit (), SubmitChanges (), InsertOnSubmit (), SubmitChanges () не работает (выдает исключение Entity Уже существует!) - PullRequest
1 голос
/ 07 февраля 2012

Я работаю над приложением манго WP7, которое использует Linq2SQL для доступа к данным.У меня есть объект Note, который имеет автоматически сгенерированный ключ типа int.

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

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

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

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

Он говорит, что не может добавить сущность, которая уже существует.Есть ли объяснение этому поведению?Заранее спасибо.

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

1 Ответ

5 голосов
/ 07 февраля 2012

Ну, вы действительно ответили на свой вопрос в конце.Давайте пройдем через это:

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

Каждый раз, когда вы делаете

SubmitChanges();

Вы обновляете свою ссылку, потому что она старая.

Так что если у вас естьметод, который выполняет несколько транзакций, которые вам необходимы для обновления вашей локальной переменной.

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

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