Внешняя таблица Entity Framework недоступна в коде xaml позади

Я пытаюсь вытащить IQueryable из моего класса DomainService в свой код XAML, используя службы RIA.

DomainService извлекает из BLL, который извлекает из DAL, который получает его из EF.

Кажется, я не могу получить доступ к внешней таблице в XAML, но я могу получить к ней доступ в методе DomainService.

Метод DomainService выглядит так...

    public IQueryable<MenuHeader> GetMenuHeaders()
    {
        BusinessLogic.Employee blEmployee = new BusinessLogic.Employee();

        int employeeId = blEmployee.GetEmployeeIdFromUserName(HttpContext.Current.User.Identity.Name);
        var menuHeaders = blEmployee.GetEmployeeMenuHeaders(employeeId);
        // This works here!
        var menuHeaderItems = from mh in menuHeaders
                              select mh.MenuHeaderItems;
        return menuHeaders;
    }

В коде XAML я вызываю этот метод здесь:

...

EmployeeContext employeeContext = new EmployeeContext();

EntitySet<MenuHeader> menuHeaders = employeeContext.MenuHeaders;            
employeeContext.Load(employeeContext.GetMenuHeadersQuery()).Completed += (s, e) =>
    {
        // This does NOT work here!
        var menuHeaderItems = from mh in menuHeaders
                              select mh.MenuHeaderItems; // <-- Not found
    };

...

Как я могу привести эту таблицу к моему коду XAML, чтобы я мог привязать к ней данные?


person Scottie    schedule 11.11.2010    source источник


Ответы (2)


Ваш код отправки и получения выглядит совершенно правильно. Если сервер правильно возвращает объекты в тестовом коде, значит, что-то пошло не так. Я испробовал несколько вариантов и не могу заставить подобный код работать всегда.

Кроме того, у вас есть 3 варианта доступа к коллекции, возвращенной службами RIA:

<сильный>1. Используйте конкретную коллекцию в контексте (как вы это делали)

EntitySet<MenuHeader> menuHeaders = employeeContext.MenuHeaders;
... // On Completed event
var menuHeaderItems = from mh in menuHeaders
                          select mh.MenuHeaderItems;

<сильный>2. Используйте свойство Entities операции загрузки

EmployeeContext employeeContext = new EmployeeContext();
var LoadOp = employeeContext.Load(employeeContext.GetMenuHeadersQuery());
// Bind to LoadOp.Entities

<сильный>3. Используйте параметр обратного вызова Load()

EmployeeContext employeeContext = new EmployeeContext();
var LoadOp = employeeContext.Load(employeeContext.GetMenuHeadersQuery(),
      (cb) => 
      {
            // do something with cb.Entities here
      }, 
      false);

Я предпочитаю версию 2 для ленивой привязки и версию 3 для любых пользовательских ответов (просто чтобы сократить количество строк кода).

person Gone Coding    schedule 12.11.2010

Проблема здесь заключалась в том, что моя модель сущности не является частью моего приложения ASP.Net/RIA. Упоминается только в.

Поскольку это ссылка, DomainService не будет автоматически генерировать метаданные. Мне пришлось вручную создавать метаданные, чтобы Silverlight знал, чего ожидать.

person Scottie    schedule 15.11.2010