2009-06-13 10 views
1

J'ai un type d'entité Order qui a une référence à un type d'entité Customer. Il y a une fonction d'importation qui renvoie une liste de commande en fonction d'un critère. Cette liste de Commandes est affichée dans un Datagrid qui montreComment charger manuellement EntityReference sans utiliser EntityReference.Load()

Order.Date | Order.Customer.Name | Order.Total

Pour que Customer.Name apparaisse, j'ai besoin de charger CustomerReference dans chaque commande de la liste, mais chaque appel à Order.CustomerReference.Load() doit faire un aller-retour vers SQL Server et faire le tout le processus est très inefficace. La question est, si j'ai une seule requête qui récupère toutes les données client pour toutes les commandes dans la liste, comment puis-je remplir manuellement le CustomerReference dans chaque commande?

Fondamentalement, j'ai besoin de faire .Inclure ("Client") avec une fonction d'importation.

Merci

Répondre

2

Si vous exécutez une requête qui ramène tous les clients connexes en une seule fois, il n'y a pas besoin de remplir manuellement chaque CustomerReference. C'est parce que quelque chose appelé Relationship Fixup le fait pour vous automatiquement.

savoir si vous faites ceci:

Order o = ctx.Orders.First(o => o.Customer.ID == 1); 
// at this point o.Customer == null 

Customer c = ctx.Customers.First(c => c.ID == 1); 
// at this point o.Customer == c 

Relation Fixup signifie que après que le client entre dans le contexte tout objet lié pointera maintenant automatiquement ... il

à savoir c'est beaucoup plus facile que tu ne le penses!

Hope this helps

Alex

-1

Merci Alex, j'ai essayé. Cela fonctionne comme vous l'avez dit mais apparemment cela ne fonctionne pas sur le type d'entité dérivée. Order Entity Type est une classe de base abstraite qui a une classe dérivée Sale.

Order o1 = ctx.Orders.First(o => o.Customer.ID == 1); 
Sale s1 = ctx.GetSaleByCustomerID_FunctionImport(2).First(); 

Customer c = ctx.Customers.First(c => c.ID == 1); 
Customer c2 = ctx.Customers.First(c => c.ID == 2); 
//At this point o.Customer == c but s1.Customer is still null 

Et je ne peux pas définir la fonction type de retour d'importation comme ordre parce qu'il est abstrait et non autorisé comme type de retour.

Qu'est-ce qui me manque ici?

Mise à jour: j'ai découvert il y a une différence entre o1 et s1 avant que les clients sont chargés o1.CustomerReference.IsLoaded est faux o1.CustomerReference.EntityKey est ID = 2

s1.CustomerReference.IsLoaded est False s1.CustomerReference.EntityKey est null

Mais l'appel de s1.CustomerReference.Load() chargerait correctement les données client. J'ai vérifié deux fois ma fonction GetSaleByCustomerID Import (simplement "SELECT * FROM Customers WHERE ID = 2"), elle renvoie le champ CustomerID requis par la référence.

Questions connexes