Я нахожусь на кривой обучения по следу Silverlight. Я разработчик, ориентированный на данные, поэтому я, естественно, выбрал клиент ADO.NET Data Services. Я ломаю голову над реальным сценарием и, похоже, не могу найти никакой помощи в документации, блогах и т. Д.
У меня есть сложная сущность Tutor со связанными наборами сущностей для адресов, телефонных номеров и адресов электронной почты. У меня также есть пара других наборов, таких как Предметы и Сертификаты. Наряду со всем этим приходят внешние ключи в таблицы поиска для таких вещей, как StatusCodes, AddressTypes (например, Home, Business и т. Д.), EmailTypes и так далее. Все это заключено в edmx в моем проекте Model. Вот часть структуры.
В Silverlight я получил UserControl, который является формой ввода данных для этого преподавателя. Я создал DTO-подобный объект для привязки данных к элементам управления TextBox клиента. Все хорошо, пока пользователь не нажмет Сохранить.
Подпрограмма Save создает и добавляет объекты Tutor и Person, добавляет их в DataServiceContext и правильно связывает их. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно добавить связанный объект, который УЖЕ хранится в контексте в базе данных, такой как кодовые таблицы.
Например, у человека может быть несколько специальностей Предмета: Элементарная математика, Элементарная наука и т. Д. TutorSubjectSet должен относиться к 3 другим наборам: Предмет (например, Математика), SubjectLevel (например, Элементарно) и затем к Репетитору. В моем DTO есть список комбинированных элементов Subject_With_Level, представляющих подмножество истинного декартова выборки (не существует такого понятия, как начальное (школьное) исчисление, по крайней мере, там, где я ходил в школу :-) Этот список отображается как список флажков в пользовательском интерфейсе. Поэтому, когда пользователь нажимает «Сохранить», я выбираю отмеченные элементы и пытаюсь найти объединенные значения Subject_With_Level.SubjectId и .SubjectLevelId в таблицах кодов, которые имеют эти значения.
Вот где я потерялся. В функции на стороне сервера у меня все будет в порядке, потому что я могу выполнить поиск в строке и сразу получить объект. В асинхронной ситуации, как я могу получить связанные сущности, пока я занят сборкой персонального графа? Выполнение асинхронного вызова в середине процесса сохранения не работает.
Я пробовал разные вещи: я пытался создать специальную реплику SubjectLevel, используя Subject_With_Level.SubjectLevelId, и привязал ее к контексту следующим образом:
public static SubjectLevel MakeFakeSubjectLevelFor(TutoringEntities ctx, Subject_With_Level subjectAndLevel)
{
var subjectLevel = new SubjectLevel()
{
SubjectLevelId = subjectAndLevel.SubjectLevelId,
Description = subjectAndLevel.SubjectLevel,
EffectiveDate = DateTime.Now,
EnteredBy = "",
EnteredDate = DateTime.Now,
Type = subjectAndLevel.SubjectLevel
};
try { ctx.AttachTo("SubjectLevelSet", subjectLevel); }
catch { //this tries to catch situations where the level (eg. Elementary) has already been created }
return subjectLevel;
}
Этот подход работает для ситуаций, когда нет дубликатов (у него также есть преимущество в том, что мне не нужно делать дополнительный вызов.) Например, в адресах будет только один домашний адрес (у меня есть аналогичная функция : MakeAFakeAddressTypeFor ()). Вы заметите, что у меня есть попытка / ловить, которая ловит ошибку, если элементы уже вставлены в SubjectLevelSet. Если элемент уже был вставлен, и я нажал эту ошибку, возвращенный subjectLevel не привязан к контексту. Я получаю сообщение об ошибке, так как элемент не отслеживается. Однако я не могу получить существующий subjectLevel без выполнения асинхронного запроса к SubjectLevelSet, даже если он находится в моем локальном контексте.
Я бы хотел сделать следующее:
var lev = ctx.SubjectLevelSet.Where(l => l.SubjectLevelId == subjectAndLevel.SubjectLevelId).FirstOrDefault();
if(lev == null )
lev = Helpers.MakeFakeSubjectLevelFor(ctx, subjectAndLevel);
но я получаю: «Указанный метод не поддерживается», что, как я полагаю, означает, что я должен выполнить запрос Async, поэтому я вернулся к той же ситуации.
Я также пытался получить список SubjectLevels в делегате события Loaded. Таким образом, у меня будет набор SubjectElements под рукой, когда нажата кнопка «Сохранить». Та же проблема, я должен выполнить асинхронный вызов, чтобы выполнить поиск, даже если он у меня в руках. Я попытался перебрать список для того, что мне нужно, но это дало мне ошибку, сказав, что сущность не отслеживалась контекстом.
Итак ... ясно, что я не понимаю этого, и яделаю это неправильно, но я не могу найти практических примеров, которые бы делали подобные вещи. Примеры с практическими рекомендациями просто удачно загружают примитивы в сущность, которую нужно сохранить. Нет примеров, которые я видел, чтобы показать связанные сущности и как их получить. Я мог бы упростить его и просто хранить целочисленные значения для codeId и не связывать их через FK, но это было бы слишком большим компромиссом.
Спасибо за любую помощь, вы можете предоставить мне.