Могу ли я «расширить» дополнительные данные на уже отслеживаемом объекте? - PullRequest
1 голос
/ 26 октября 2011

Я использую WCF Dataservice / EF 4.1 и клиентское приложение WPF. Вот моя проблема в более простой форме. Допустим, я опрашиваю клиентов:

var query = (from o in ServiceRef.Clients.Expand("Addresses,PhoneNumbers,EmailAddresses")
                       where o.FirstName.ToLower().Contains(sf) ||
                             o.LastName.ToLower().Contains(sf) || ...
                         orderby o.LastName
                         select o).Take(100);

Это все, что мне нужно для идентификации клиента. Однако в будущем я хочу увидеть комментарии, историю покупок или другие связанные объекты, не «расширенные» в первом запросе. Если я сделаю запрос снова, используя тот же контекст ServiceRef, у меня никогда не будет расширен «Комментарии».

Я предполагаю, что это связано с тем, что Контекст обнаруживает, что сущность «Клиент» уже отслежена, и, следовательно, не выполняет новый запрос к Сервису.

Теперь в некоторых сообщениях говорится, что никогда не следует хранить DBContext так долго, с чем я не согласен полностью. Это простой сценарий Master / Details. Создание нового контекста для каждого «подробного запроса» для получения дополнительных данных кажется каким-то неправильным. Есть ли способ заставить EF «перезагрузить» сущность для получения дополнительных данных?

Конечно, я могу расширить каждую присоединенную сущность, которая мне когда-либо понадобится в начальном запросе. Но затем я получаю огромное количество данных для каждого результата поиска. 95% из которых никогда не будут использованы.

Чтобы было ясно. То, о чем я прошу, - это вопрос «лучшей практики». Есть ли путь в середине? Между расширением (...) всех данных все время <> Создание нового контекста все время.? Есть ли способ загрузить дополнительные данные при необходимости.

Спасибо, Андреас

1 Ответ

1 голос
/ 26 октября 2011

Ваш вопрос состоит из двух частей.

Как получить дополнительные данные?

  • Вы можете использовать ServiceRef.Clients.Expand("Comments") в своем первоначальном запросе, но это, очевидно, то, что вам не нужно - это называется готовая загрузка
  • Или вы можете использовать ServiceRef.LoadProperty(client, "Comments") для заполнения комментариев только для одного клиента - это можно назвать явной загрузкой

Как долго должен существовать контекст?

Это зависит. Правильный подход действительно заключается в том, чтобы поддерживать контекст как можно более коротким, но это не значит закрывать контекст после каждой операции. Контекст должен использоваться как единица работы, и все связанные операции должны выполняться в одном экземпляре контекста. В случае приложения WPF / WinForm это означает, что контекст действительно может существовать в течение более длительного периода времени - он обычно связан с некоторой формой / ведущим / и т. Д. Вы не должны использовать один и тот же контекст среди нескольких форм, которые не связаны и не образует единицу работы / логическую операцию (объекты в одной единице работы управляются и сохраняются вместе).

...