LINQ - как заставить работать отслеживание изменений, когда сущность передается другому классу как свойство - PullRequest
1 голос
/ 05 октября 2010

Вот сценарий:

У меня есть пользовательский элемент управления ASP.NET, который выполняет запрос LINQ, сохраняет результаты в общем списке, а затем динамически загружает другой пользовательский элемент управления (в заполнитель) и передает один изобъекты из Списка в элемент управления через свойство элемента.

Дочерний элемент управления отображает данные из объекта и позволяет пользователю изменять различные поля.Кнопка «Сохранить» на родительском элементе управления вызывает метод «SaveInput» на дочернем элементе управления, который обновляет свойства объекта на основе введенных данных (на этом этапе не было создано никакого DataContext).

Проблема заключается в том, что я могу 'Похоже, что для сохранения обновленного объекта используется метод SubmitChanges объекта DataContext.Вот что я попробовал:

  • Если я вызываю SubmitChanges из родительского элемента управления, он не распознает изменения, которые нужно сохранить, даже если вы изучаете исходный объект (всписок родительского элемента управления) он явно получил новые значения свойств.Я предполагаю, что это потому, что изменения не были сделаны через DataContext родительского элемента управления.

  • Если я пытаюсь (в коде родительского элемента управления) Присоединить объект к DataContext, я получаю ошибку, котораяон уже присоединен (ну, это так справедливо).

  • Если я создаю DataContext (в коде дочернего элемента управления), то пытаюсь присоединить к нему объект, я получаюошибка, что он уже присоединен к другому DataContext (опять же, это правда)

Поэтому мое неуклюжее решение состоит в том, чтобы создать DataContext (в коде дочернего элемента управления), а затем создать новый экземпляртип объекта, затем установите каждое свойство этого нового объекта из эквивалента измененного объекта, затем SubmitChanges.Не элегантно, но работает.

Есть ли лучший способ?

1 Ответ

1 голос
/ 05 октября 2010

Я бы порекомендовал повторно извлечь точную запись из вашего нового DataContext, например,

ctxt.Table.Where(x => x.ID == recordYouHave.ID).FirstOrDefault()

И затем сохраните изменения в этой записи перед вызовом 'SubmitChanges'.

Другое решение состоит в том, чтобы сохранить контекст, который вы использовали для извлечения исходной записи, но Вы не хотите этого делать! Каждый контекст должен быть кратковременным. Это объяснит это лучше, чем я.

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

var orig = ctxt.Table.Where(x => x.ID == recordYouHave.ID).FirstOrDefault();
ctxt.Table.Attatch(orig, recordYouHave);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...