2010-11-11 27 views
0

Je tente de tirer un IQueryable de ma classe DomainService à mon code XAML derrière l'aide des services RIA. Le DomainService tire d'une BLL, qui tire d'un DAL, qui l'obtient de EF.Entité cadre table étrangère non accessible dans le code xaml derrière

Je ne peux pas sembler accéder à la table étrangère dans le XAML, mais je peux y accéder très bien dans la méthode DomainService.

La méthode DomainService ressemble à ceci ...

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; 
    } 

Dans le code XAML derrière, j'appelle cette méthode ici:

...

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 
    }; 

...

Comment puis-je obtenir cette table avec mon code XAML pour que je puisse y accéder?

Répondre

0

Le problème ici était que mon modèle d'entité ne fait pas partie de mon application ASP.Net/RIA. Il est seulement référencé dans.

Comme il s'agit d'une référence, DomainService ne générera pas automatiquement les métadonnées. J'ai dû créer manuellement les métadonnées pour que Silverlight sache à quoi s'attendre.

0

Vos codes d'envoi et de réception apparaissent parfaitement corrects. Si le côté serveur retourne correctement les entités dans votre code de test, alors quelque chose s'est mal passé. J'ai essayé plusieurs variations et ne peux pas obtenir le code semblable pour échouer jamais.

En aparté, vous avez 3 options pour accéder à une collection retournée de services RIA:

1. Utilisez la collection spécifique dans le contexte (comme vous l'avez fait)

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

2. Utilisez la propriété Entités de l'opération de chargement

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

3. Utilisez le paramètre de rappel de charge()

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

Je préfère la version 2 pour la liaison et 3 paresseux pour toutes les réponses personnalisées (juste pour garder les lignes de code vers le bas).