Хорошо, короткая версия состоит в том, что у меня есть сущность Linq из LinqDataSourceUpdateEventArgs, и мне нужно обрабатывать обновление вручную, потому что MS была глупой.
Я могу получить объект Table из контекста данных, что позволяет мне:
var newObj = e.NewObject;
var table = FormContext.GetTable(e.NewObject.GetType());
table.Attach(newObj, e.OriginalObject);
if (BuildingObject != null)
BuildingObject(sender, new HeirarchicalBuildObjectEventArgs(newObj));
FormContext.SubmitChanges();
К сожалению, я получаю исключение "Невозможно добавить объект с ключом, который уже используется."
Конечно, забавно то, что я получаю это в FormContext.SubmitChanges (), а не в table.Attach () ... что не имеет смысла для меня, но что угодно.
Я думаю, мне нужно на самом деле получить объект из контекста и присоединить, используя его вместо e.OriginalObject ... ИЛИ, в крайнем случае, мне нужно получить исходный объект и написать цикл, который копирует значение каждого свойства в одно, которое я получаю из контекста данных.
В любом случае мне нужно искать объект по его первичному ключу, не зная типа объекта. Есть ли способ сделать это?
РЕДАКТИРОВАТЬ: Хорошо, посмотрел .NET Reflector, и я заметил, что, среди прочего, LinqDataSourceView присоединяет объект данных OLD и затем копирует все значения в него ... но это, очевидно, пропускает ассоциации. Я попробую прикрепить старый объект и скопировать значения, я думаю ...
Действительно забавная часть? Я давно написал функцию для копирования свойств из одного экземпляра объекта в другой, и она содержит этот комментарий:
// Мы не можем копировать ассоциации, и, вероятно, не должны
Иногда мне хотелось бы, чтобы мои комментарии были более тщательными ...
РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Хорошо, еще раз правильный ответ: я задал неправильный вопрос!
Правильный код:
var newObj = e.NewObject;
var table = FormContext.GetTable(e.NewObject.GetType());
if (BuildingObject != null)
BuildingObject(sender, new HeirarchicalBuildObjectEventArgs(newObj));
table.Attach(newObj, e.OriginalObject);
FormContext.SubmitChanges();
e.Cancel = true;
Изначально я пытался присоединиться после BuildingObject, но получил другую ошибку и переместил оператор присоединения, чтобы исправить его. (Я думаю, потому что я вызывал неправильную версию Attach. Или, может быть, я перевернул аргументы ...)