2010-07-27 16 views
3

J'ai une maquette très simple que je fais pour un client qui utilise la base de données Northwind. J'ai un fichier EDMX avec trois entités: produits, catégories et fournisseurs.Comment puis-je obtenir EntityDataSource pour me permettre d'accéder à des entités enfants?

J'essaye de créer une page qui a un GridView qui montre les produits, y compris le nom de catégorie et le nom de fournisseur. Avec LINQ to SQL je peux avoir le contrôle LinqDataSource retourne l'entité Produits et peut alors avoir un TemplateField dans le GridView comme ceci:

<ItemTemplate> 
    <%# Eval("Category.CategoryName") %> 
</ItemTemplate> 

Cependant, il semble que le EntityDataSource ne joue pas si bien. C'est comme si elle ne chargeait pas paresseusement les données de la catégorie. J'ai un très simple EDS:

<asp:EntityDataSource ID="dsProducts" runat="server" 
    ConnectionString="name=NorthwindEntities" 
    DefaultContainerName="NorthwindEntities" EnableFlattening="False" 
    EntitySetName="Products"> 
</asp:EntityDataSource> 

Mais le GridView ne montre pas le nom de la catégorie. Si je crée un gestionnaire d'événements RowDataBound pour GridView et que l'entité Product est liée à la ligne, je vois que la propriété Category du produit renvoie Nothing. Par exemple, si je fais:

Protected Sub gvProducts_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvProducts.RowDataBound 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     Dim p As NorthwindModel.Product = e.Row.DataItem 
     Dim catName = p.Category.CategoryName 
    End If 
End Sub 

je reçois un NullReferenceException lorsque vous essayez de faire p.Category.CategoryName.

Cependant, je sais que les travaux de chargement paresseux pour le EDMX b/c si j'écrire du code dans le gestionnaire d'événements Page_Load comme:

Dim context As New NorthwindModel.NorthwindEntities 
    Dim p = context.Products.Take(1).Single() 

Je peux obtenir le nom de la catégorie via p.Category.CategoryName sans erreur.

Y a-t-il du vaudou que je dois faire pour que l'entité EntityDataSource inclue le support de la récupération des entités associées?

Merci

SOLUTION: I spécifié Inclure propriété du EntityDataSource, notant l'entité des objets à inclure. Plus précisément, je mis à jour le balisage déclaratif de mon contrôle EntityDataSource à:

<asp:EntityDataSource ID="dsProducts" runat="server" 
    ConnectionString="name=NorthwindEntities" 
    DefaultContainerName="NorthwindEntities" EnableFlattening="False" 
    EntitySetName="Products" Include="Category,Supplier"> 
</asp:EntityDataSource> 

Répondre

5

Vous devez utiliser la propriété Inclure de la source de données d'entité pour obtenir des entités apparentées. Ensuite, modifiez le balisage pour interroger ces entités.

Jetez un oeil à quelques pages du livre « Programmation Entity Framework »: vous http://books.google.com/books?id=wp8V0vBebnoC&pg=PA284&lpg=PA284&dq=entitydatasource+include&source=bl&ots=cKtfB1J8vC&sig=C--WGKuU-9CNOQgDxdN0MpSMLt4&hl=en&ei=OidPTMnKB5P-ngeM1rinBw&sa=X&oi=book_result&ct=result&resnum=7&ved=0CDAQ6AEwBg#v=onepage&q=entitydatasource%20include&f=false

+0

Merci, merci, merci! Pour la notice, j'ai ajouté la propriété Include = "Category, Supplier" dans le balisage déclaratif d'EntityDataSource. –