Linq и DeleteAllOnSubmit боль

Следующий код загружает концерт, очищает коллекцию выступлений концертов, а затем добавляет новый номер.

            Data.LinqToSQL.Gig dbGig = DBContext.Gigs.Where(x => x.ID == myGigID).SingleOrDefault();

            //Remove all references to the current acts
            if (dbGig.Acts!=null) {
                DBContext.Acts.DeleteAllOnSubmit(dbGig.Acts);
            }

            Data.LinqToSQL.Act dbAct =  new ListenTo.Data.LinqToSQL.Act();
            dbAct.ID = Guid.NewGuid();
            DBContext.Acts.InsertOnSubmit(dbAct);

            DBContext.SubmitChanges();

Обратите внимание, что каждый раз, когда я запускаю этот код, значение myGigID одно и то же, поэтому это всегда тот же самый концерт, который я загружаю.

В первый раз, когда я запускаю этот код, он работает нормально, и у меня концерт с 1 актом.

Во второй раз dbGig.Acts (коллекция) имеет счетчик 0, поэтому DeleteAllOnSubmit не удаляет никаких действий. Однако в базе есть 1 акт для этого концерта! Следовательно, после запуска этого кода я получаю 2 действия.

Если я запущу его в третий раз, у меня всего будет 3 акта.

Есть идеи, что я делаю не так?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
4 927
4

Ответы 4

Ну, вы никогда не ассоциируете новую группу ни с каким концертом - разве этого не хватает?

dbGig.Acts.Add(dbAct);

или, может быть:

dbAct.Gig = dbGig;

или что-то с идентификаторами.

т.е. вы уверены, что действие в БД предназначено для концерта?

Попробуйте открыть новый DBContext в начале этого блока. Если вы используете один и тот же контекст для первого и второго запуска, он не увидит вставленную запись во второй раз. Сброс контекста должен заставить его видеть последние строки в таблице.

Альтернативой ответу gfrizzle является отсутствие веских причин для этого: не вызывайте SubmitChanges до тех пор, пока вы не выполните всю работу с БД.

У меня была аналогичная проблема, проблема / решение в моем случае заключалась в том, что во внутреннем классе, представляющем таблицу базы данных, отсутствовала часть первичного ключа.

Это работало нормально, пока данные из БД не вызвали ограничение первичного ключа в коде, которым была довольна база данных.

PT

Другие вопросы по теме