Silverlight не получает данные из моей службы WCF RIA - PullRequest
2 голосов
/ 06 июля 2010

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

Чтобы воссоздать то, что я сделал, вам потребуется создать новое приложение Silverlight Business, создать объект данных, который указывает на базу данных Adventureworks LT, и сгенерировать веб-службы для этих объектов (включая редактирование).

Затем я просто добавил RichTextbox в Home.xaml и в Home.xaml.cs я сначала добавил этот код в OnNavigatedTo, а когда это не сработало в конструкторе.

    AdventureWorksDomainContext ctx = new AdventureWorksDomainContext();

    EntityQuery<Product> query =
        from p in ctx.GetProductsQuery()
        select p;
    LoadOperation<Product> loadOp = ctx.Load(query);

    var paragraph = new Paragraph();
    foreach (var product in loadOp.Entities)
    {
        paragraph.Inlines.Add(new Run { Text = product.Name });
    }

    richTextBox1.Blocks.Add(paragraph);

Когда я запускаю страницу, я никогда не вижу, чтобы loadOp.Entities содержали значение, и я вижу только ожидаемый запрос. Пройдите по сети после того, как весь мой код будет выполнен.

Мне кажется, что я упускаю что-то фундаментальное, и это будет иметь больше смысла, если я найду кого-нибудь, кто мне это объяснит.

Спасибо, Эрик

1 Ответ

2 голосов
/ 06 июля 2010

Проблема связана с тем, как вы загружаете данные. Фактическая операция загрузки является асинхронной, как и все сетевые вызовы Silverlight. Вы звоните ctx.Load(query), а затем немедленно устанавливаете абзац для сущностей. Вам нужно использовать обратный вызов, когда Load завершено. Как то так,

    AdventureWorksDomainContext ctx = new AdventureWorksDomainContext();

EntityQuery<Product> query =
    from p in ctx.GetProductsQuery()
    select p;
LoadOperation<Product> loadOp = ctx.Load(query,() => 
{
    var paragraph = new Paragraph();
    foreach (var product in loadOp.Entities)
    {
        paragraph.Inlines.Add(new Run { Text = product.Name });
    }

    richTextBox1.Blocks.Add(paragraph);
});

Поскольку вы не используете сущности непосредственно в привязке и просто выполняете их итерацию, вам необходимо убедиться, что вы подождали, пока они не загрузятся. Я не могу вспомнить фактическую подпись метода Load, поэтому вам может потребоваться изменить мою лямбду, чтобы она работала.

...