Linq2SQL: DeleteAllOnSubmit различает повторно добавляемые объекты? - PullRequest
0 голосов
/ 27 января 2010

Обнаружение странного поведения с Linq:

Положение:

  1. У меня есть отношения многие ко многим между двумя объектами: UserProfile и BusinessUnit (объединены в таблицу UserProfile_BusinessUnit).

  2. Используя ListBox, пользователь может выбрать несколько BusinessUnits, к которым принадлежит UserProfile.

  3. При обновлении записи я звоню:

    dataContext.UserProfile_BusinessUnit.DeleteAllOnSubmit (userProfile.BusinessUnits); dataContext.SubmitChanges ();

  4. В результате удаляются записи из UserProfile_BusinessUnit

  5. Затем я добавляю записи обратно из мульти-выбора, используя foreach

    foreach (var b в модели. BusinessUnitsSelected) { userProfile.BusinessUnits.Add (GetBusinessUnitAsEntity (b.ToString ())); } dataContext.SubmitChanges ();

Выпуск:

Только NET NEW BusinessUnits добавляются обратно в отношения. Если BusinessUnit остается выбранным и адресуется как часть DeleteAllOnSubmit, он не добавляется повторно ... это похоже на то, что dataContext продолжает видеть запись как помеченную для удаления (даже если я уже вызвал SubmitChanges ()). ..

РЕДАКТИРОВАТЬ: я пытался удалить SubmitChanges () между вызовами, чтобы увидеть, если он будет разрешен, но он только заканчивает тем, что удаляет все записи и не добавляет заново ...

РЕДАКТИРОВАТЬ: я добавил следующее, чтобы это работало ... мне кажется, взломать:

 dataContext = null;
 dataContext = new UserProfileDataContext();

Не должен ли быть способ заставить текст данных "фиксировать" и двигаться дальше?

Есть идеи, как мне поступить? Я думал о том, чтобы сбросить DeleteAllOnSubmit и явно сравнить то, что происходит, с выходом ... но кажется, что это намного больше работы, чем мне нужно сделать ...

Спасибо!

Код:

dataContext.UserProfile_BusinessUnits.DeleteAllOnSubmit(userProfile.UserProfile_BusinessUnits);
dataContext.SubmitChanges(); // all records deleted

foreach (var b in model.BusinessUnitsSelected)
   {
     userProfile.BusinessUnits.Add(GetBusinessUnitAsEntity(b.ToString()));
   }
cx.SubmitChanges(); // only net new being added

1 Ответ

0 голосов
/ 27 января 2010

Попробуйте это:

foreach (var b in model.BusinessUnitsSelected) 
   { 
     var unit = GetBusinessUnitAsEntity(b.ToString());
     userProfile.BusinessUnits.Add(unit); 
     db.BusinessUnits.InsertOnSubmit(unit);
   } 

Где вы добавляете в локальную коллекцию и в таблицу основных бизнес-единиц.

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