Linq и DeleteAllOnSubmit боль - PullRequest
       19

Linq и DeleteAllOnSubmit боль

2 голосов
/ 30 декабря 2008

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

            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 действия.

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

Ответы [ 4 ]

2 голосов
/ 08 января 2009

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

1 голос
/ 10 января 2009

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

0 голосов
/ 20 ноября 2012

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

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

PT

0 голосов
/ 30 декабря 2008

Ну, вы никогда не ассоциировали новый акт с каким-либо концертом - это то, чего не хватает?

dbGig.Acts.Add(dbAct);

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

dbAct.Gig = dbGig;

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

т.е. Вы уверены, что акт в БД для концерта?

...