Следующий код загружает концерт, очищает коллекцию выступлений концертов, а затем добавляет новый номер.
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 акта.
Есть идеи, что я делаю не так?





Ну, вы никогда не ассоциируете новую группу ни с каким концертом - разве этого не хватает?
dbGig.Acts.Add(dbAct);
или, может быть:
dbAct.Gig = dbGig;
или что-то с идентификаторами.
т.е. вы уверены, что действие в БД предназначено для концерта?
Попробуйте открыть новый DBContext в начале этого блока. Если вы используете один и тот же контекст для первого и второго запуска, он не увидит вставленную запись во второй раз. Сброс контекста должен заставить его видеть последние строки в таблице.
Альтернативой ответу gfrizzle является отсутствие веских причин для этого: не вызывайте SubmitChanges до тех пор, пока вы не выполните всю работу с БД.
У меня была аналогичная проблема, проблема / решение в моем случае заключалась в том, что во внутреннем классе, представляющем таблицу базы данных, отсутствовала часть первичного ключа.
Это работало нормально, пока данные из БД не вызвали ограничение первичного ключа в коде, которым была довольна база данных.
PT