Службы RIA - Silverlight 4.0 - Доступ к объектам из кода - PullRequest
3 голосов
/ 25 августа 2010

У меня странная ситуация. У меня есть простой проект для проверки функциональности RIA в Silverlight 4.0.

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

//test One with query provided to DataSource
var q = ctx.GetDoctorsWithPatientsAndHospitalQuery();
var result = ctx.Load(q);

//test Two using EntityQuery
EntityQuery<Doctor> query =
    from c in ctx.GetDoctorsWithPatientsAndHospitalQuery()
    select c;
LoadOperation<Doctor> loadOp = this.ctx.Load(query);
var result2 = loadOp.Entities;

//test Three using only entity and Linq
var result3 = ctx.Doctors.ToList();

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

Doctor newDoctor = new Doctor()
{
    FirstName = firstNameTextBoxNew.Text,
    LastName = lastNameTextBoxNew.Text,
    Hospital_Id = tmp,
    Hospital = tmpH
};

ctx.Doctors.Add(newDoctor);
ctx.SubmitChanges();

Может кто-нибудь указать мне, что я сделал неправильно, чтобы выполнить выбор из кода?

С уважением, Даниэль Сковронски

1 Ответ

3 голосов
/ 25 августа 2010

Вызов «LoadOperation loadOp = this.ctx.Load (query);»from code - это асинхронная операция, поэтому вы в основном проверяете результат до его завершения.

Если вы хотите увидеть результаты, вам необходимо предоставить обратный вызов методу Load (), который будет выполняться последанные загружены.

Источники данных для доменных служб обрабатывают асинхронные обновления, поэтому продолжайте распространять изменения по мере завершения операций загрузки.

Ваше "сохранение" работает, так как не ожидает результата,Вы вручную проверяете базу данных впоследствии.Не проверять это в коде.

Надеюсь, это поможет.

Для быстрой проверки попробуйте это (точка останова в строке "result2 =").В этом примере ваш loadOp избыточен, но я не хотел слишком сильно изменять ваш код:

LoadOperation<Doctor> loadOp = this.ctx.Load(query, loadOperation => 
    { 
        var result2 = loadOp.Entities;
    }, null);

** Примечание: для тех, кто хочет редактировать этот код ... Пожалуйста, не делайте.Я хотел сохранить вкус кода Аскера.loadOp и loadOperation указывают на один и тот же объект, и result2 был выбран в качестве имени переменной для запрашивающей стороны. *

...