2010-02-17 7 views
19

Ho due tabelle di SQL Server con chiavi primarie (PK) e una chiave esterna (FK) che collegano le due tabelle:Colonne di due tabelle di database relativi a uno ASP.NET GridView con EntityDataSource

1) Table "Order" 

OrderID, int, PK 
AddressID, int, FK 
... 

2) Table "Address" 

AddressID, int, PK 
City, nvarchar(50) 
... 

Poi ho Ho creato un modello di dati di entità (ADO.NET) fuori da queste due tabelle. Ora sulla mia pagina Web (ASP.NET) ho inserito un GridView con EntityDataSource. Nel mio GridView voglio visualizzare due colonne:

  • IDOrdine
  • City (appartenenti a quell'ordine e legati da tasto AddressID)

Come posso fare questo? Il mio problema è: quando configuro la Sorgente dati entità posso selezionare un "EntitySetName" che può essere "Ordine" o "Indirizzo" ma non entrambi, né posso selezionare alcun tipo di relazione. Se seleziono "ordine" come EntitySetName poi in GridView posso aggiungere le colonne

  • OrderID
  • Indirizzo
  • Address.AddressID

Aggiunta colonna "Indirizzo" visualizza le celle vuote . Aggiungendo "OrderID" e "Address.AddressID" vengono visualizzati gli ID previsti. Ma come posso aggiungere alla "città" del relativo indirizzo sul mio GridView?

Grazie per l'aiuto in anticipo!

Edit: Precisazione:

Entity Framework ha creato una classe "ordine" e una classe "Indirizzo" corrispondenti alle tabelle del database. La classe "Ordine" ha un riferimento a un oggetto "Indirizzo" come proprietà di navigazione, corrispondente alla relazione 1-n tra la tabella Indirizzo e Ordine.

Fondamentalmente voglio avere una colonna nel mio GridView che visualizza Order.Address.City. Ho provato ad aggiungere un campo associato a "Address.City" come campo dati al GridView ma si traduce in un errore di runtime ("nessuna proprietà di questo tipo ...").

risposta

43

OK, troppo molte ore più tardi mi sono trovato la soluzione:

Opzione 1:

E 'possibile utilizzare il selezionare proprietà nel EntityDataSource che permette di creare proiezioni arbitrarie di i dati da diverse tabelle entità correlate/database (nel mio caso: IDOrdine da entità dell'Ordine e Città dall'entità Indirizzo)

Svantaggio: Utilizzando selezionare in EntityDataSource rende impossibile l'uso di Insert, Update e Delete in GridView!

Opzione 2:

L'EntityDataSource deve avere la includono proprietà per includere la proprietà indirizzo relativo insieme con gli ordini interrogati. Il markup sembra piace questo:

<asp:EntityDataSource ID="EntityDataSourceOrders" runat="server" 
    ConnectionString="name=MyEntitiesContext" 
    DefaultContainerName="MyEntitiesContext" 
    EntitySetName="Order" Include="Address" 
    EnableDelete="True" EnableInsert="True" 
    EnableUpdate="True"> 
</asp:EntityDataSource> 

Poi la collezione colonne del GridView può avere un campo di modello come questo:

<asp:TemplateField HeaderText="City" > 
    <ItemTemplate> 
    <asp:Label ID="LabelCity" runat="server" Text='<%# Eval("Address.City") %>'> 
    </asp:Label> 
    </ItemTemplate> 
</asp:TemplateField> 

Qui Eval è importante. Bind non funziona. Anche utilizzando un BoundField come una colonna ...

<asp:BoundField DataField="Address.City" HeaderText="City" /> 

... è NON possibile. Quindi non è possibile in GridView modificare la città (il che ha senso perché è un campo correlato che appartiene ad un'altra tabella e forse a molti altri ordini). Ma è possibile modificare i campi piatti dell'entità dell'ordine e anche il "AddressID" dell'ordine per assegnare un altro indirizzo.

+0

stasera stavo facendo un progetto di esempio- questa risposta è stata molto utile quando si cerca di impostare un costrutto simile. Grazie. –

+7

Vorrei poter aggiungere di nuovo questa risposta ogni volta che torno a questa domanda, specialmente per "usare un BoundField come colonna ... NON è possibile". –

Problemi correlati