Esempio della Guida rapida relativo a EntityDataSource
Aggiornamento: novembre 2007
Nell'esempio contenuto in questo argomento viene illustrato l'utilizzo del controllo EntityDataSource di ADO.NET per implementare uno scenario di associazione dati. Nell'applicazione di esempio vengono visualizzati elementi SalesOrderDetail associati a un elemento SalesOrderHeader identificato dalla chiave di identità di SalesOrderHeader. Il modello di dati utilizzato nell'applicazione è basato sul database di esempio AdventureWorks fornito con SQL Server 2005.
Nella visualizzazione riportata di seguito viene mostrato lo strumento utilizzato. Una casella di riepilogo sul lato sinistro della pagina contiene le chiavi di identità degli elementi SalesOrderHeader. Nella visualizzazione è stato selezionato il numero 43666 di SalesOrderHeader. Gli elementi SalesOrderDetail associati vengono visualizzati dal controllo Gridview a destra.
Modalità di implementazione dell'esempio
L'esempio viene implementato attraverso le seguenti fasi:
Creazione di un'applicazione Web ASP.NET.
Aggiunta di ADO.NET Entity Data Model in base al database AdventureWorks.
Aggiunta di una casella di riepilogo per visualizzare le chiavi di SalesOrderHeader.
Aggiunta di un controllo GridView per visualizzare gli elementi SalesOrderDetail associati.
Aggiunta e configurazione di due controlli EntityDataSource per fornire dati alla casella di riepilogo e ai controlli GridView.
Aggiunta di un gestore eventi per l'evento di modifica dell'indice selezionato della casella di riepilogo.
Creazione di un'applicazione Web ASP.NET
Dal menu File di Visual Studio creare un'applicazione ASP.NET. Assegnare al progetto il nome GetOrders EDSC. Viene aperto il markup della pagina Default.aspx che visualizza la sintassi HTML form e div vuota.
Assegnare un titolo alla pagina tra i tag del titolo.
Aggiunta di ADO.NET Entity Data Model
I dati che verranno utilizzati da questa applicazione rappresentano un'implementazione di Entity Data Model (EDM) basata sulle tabelle nell'esempio di AdventureWorks fornito con SQL Server 2005.
Vengono dichiarate cinque entità:
Indirizzo
Contact
Prodotto
SalesOrderDetail
SalesOrderHeader
Le istanze di questi tipi sono contenute logicamente da set di entità con lo stesso nome nel modello a oggetti compilato in base allo schema concettuale.
Vengono dichiarati tre associazioni e set di associazioni. I nomi delle associazioni riportate di seguito iniziano tutti con FK_, per riflettere le relazioni di chiave esterna nelle tabelle dei dati di AdventureWorks.
FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID
FK_SalesOrderHeader_Address_ShipToAddressID
FK_SalesOrderHeader_Contact_ContactID
Per creare il modello Sales di AdventureWorks:
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto GetOrders EDSC.
Fare clic su Aggiungi/Nuovo elemento.
Selezionare ADO.NET Entity Data Model e assegnare al nuovo modello di dati il nome AdvWksSales.edmx.
Quando viene visualizzata la procedura guidata Entity Data Model, selezionare Genera da database, quindi scegliere Avanti.
Creare una connessione al database AdventureWorks, quindi scegliere Avanti.
Quando viene visualizzata la finestra di dialogo Seleziona oggetti di database, selezionare Address, Contact, Product, SalesOrderDetail e SalesOrderHeading. Scegliere Fine.
Viene aperta la finestra di progettazione AdvWksSales.edmx, che visualizza le entità e le associazioni del modello di dati. Si noti l'associazione uno-a-molti tra l'entità SalesOrderHeader e l'entità SalesOrderDetail. Questi due tipi di dati e la reciproca associazione verranno utilizzati nell'applicazione di esempio. Compilare il progetto per creare il modello di dati.
Aggiunta di controlli per la visualizzazione dei dati
Sono necessari due controlli dati per visualizzare le chiavi di SalesOrderHeader e gli elementi SalesOrderDetail associati.
Per aggiungere controlli per la visualizzazione alla pagina:
Aprire la visualizzazione Progettazione di Default.aspx in Visual Studio e trascinare il bordo di div verso il basso in modo che vi sia spazio sufficiente per aggiungere controlli alla pagina.
Aggiungere un'etichetta con il testo: Select SalesOrderHeaderID.
Aggiungere una casella di riepilogo sotto l'etichetta. Può essere utilizzato l'ID predefinito, ListBox1. Impostare la dimensione e la posizione della casella di riepilogo in base al markup della pagina riportato alla fine di questa pagina.
Aggiungere un controllo GridView alla pagina e impostarne la posizione in base al markup della pagina riportato alla fine di questo argomento. Può essere utilizzato l'ID predefinito, GridView1.
Aggiungere un'etichetta sopra il controllo GridView con il testo: SalesOrderHeader ID.
Aggiungere un'altra etichetta sopra GridView. Questa etichetta verrà utilizzata in un parametro di un oggetto CommandText. Assegnarle un ID che ne rifletta lo scopo, ad esempio: labelHeaderIDFromList. Impostare il testo di tale etichetta su una stringa vuota.
Aggiunta e configurazione dei controlli EntityDataSource
Per aggiungere i controlli EntityDataSource:
Aggiungere un controllo EntityDataSource alla pagina. Assegnare a questo controllo EntityDataSource il nome EntDataSrc_OrderID. Tale controllo verrà associato a ListBox1 per visualizzare le chiavi di SalesOrderHeader.
Aggiungere un altro controllo EntityDataSource alla pagina. Assegnare a questo controllo EntityDataSource il nome EntDataSrc_OrderDetails. Tale controllo verrà associato a Gridview1 per visualizzare le entità SalesOrderDetail associate alla chiave di identità di SalesOrderHeader selezionata dall'utente in ListBox1.
Nota: |
---|
Se il progetto non è stato compilato dall'aggiunta di Entity Data Model (EDM) per AdvWksSalesModel, compilarlo ora. In caso contrario, i passaggi riportati di seguito non funzioneranno come descritto. La compilazione del progetto EDM posiziona gli elementi dei metadati EDM nel percorso designato dalla stringa di connessione nel file WebConfig. |
Per configurare l'associazione dati di ListBox1 su EntDataSrc_OrderID:
Fare clic sul simbolo > nel controllo EntityDataSource.
Fare clic su Configura origine dati.
Quando viene visualizzata la finestra di dialogo Configura ObjectContext, selezionare Connessione denominataAdventureWorksEntities dall'elenco a discesa. In tal modo viene identificata una stringa di connessione del file WebConfig.
Dall'elenco a discesa DefaultContainerName selezionare AdventureWorksEntities, che rappresenta il nome dell'oggetto EntityContainer utilizzato dal modello di dati nel relativo schema di progettazione. Scegliere Avanti.
Quando viene visualizzata la finestra di dialogo Configura selezione dati, selezionare SalesOrderHeader dall'elenco a discesa EntitySetName. Questo tipo non fa parte di una gerarchia di ereditarietà, pertanto EntityTypeFilter può essere lasciato vuoto.
Nelle caselle di controllo relative all'istruzione Select, selezionare SalesOrderID. Scegliere Fine.
Fare clic sul simbolo > in ListBox1, quindi selezionare Scegli origine dati.
Quando viene visualizzata la finestra di dialogo Seleziona origine dati, scegliere EntDataSrc_OrderID dall'elenco a discesa Selezionare un'origine dati. Nei due elenchi a discesa successivi selezionare SalesOrderID.
Scegliere OK.
In questa fase si consiglia di eseguire l'applicazione. La casella di riepilogo visualizzerà tutte le chiavi di identità delle entità SalesOrderHeader nell'origine dati. Queste informazioni saranno utili quando viene implementato il resto dell'applicazione e l'utente può selezionare una chiave e visualizzare tutte le entità SalesOrderDetail associate a SalesOrderHeader in Gridview1 sul lato destro della pagina.
Configurazione di EntityDataSource con il controllo GridView
Per associare gli ordini associati a Gridview1:
Selezionare il controllo EntityDataSource denominato EntDataSrc_OrderDetails nell'area di progettazione della pagina Default.aspx.
Fare clic sul simbolo > nel controllo EntityDataSource.
Fare clic su Configura origine dati.
Quando viene visualizzata la finestra di dialogo Configura ObjectContext, selezionare Connessione denominataAdventureWorksEntities dall'elenco a discesa.
Dall'elenco a discesa DefaultContainerName selezionare AdventureWorksEntities,
Scegliere Avanti.
Quando viene visualizzata la finestra di dialogo Configura selezione dati, selezionare SalesOrderDetail dall'elenco a discesa EntitySetName. Questo tipo non fa parte di una gerarchia di ereditarietà, pertanto EntityTypeFilter può essere lasciato vuoto.
Nelle caselle di controllo relative all'istruzione Select, selezionare SalesOrderDetailID, OrderQty, ProductID, UnitPrice e ModifiedDate.
Scegliere Fine.
Fare clic con il pulsante destro del mouse sul controllo EntityDataSource, quindi selezionare Proprietà.
Dall'elenco Proprietà selezionare Where, quindi fare clic sui puntini di sospensione situati sul lato destro della casella di testo.
Quando viene visualizzata la finestra di dialogo Editor espressioni, digitare il seguente testo nell'area di testo Espressione Where: it.[SalesOrderID] = @parSalesOrderID.
Fare clic sul pulsante Aggiungi parametro nella casella di riepilogo Parametri. Assegnare al nuovo parametro il nome parSalesOrderID. Questo parametro verrà ottenuto dal testo di un'etichetta impostata quando l'utente seleziona una chiave di identità nella casella di riepilogo SalesOrderHeader e viene specificato nell'elenco a discesa Origine parametro.
Selezionare Controllo.
Dall'elenco a discesa ControlID selezionare labelHeaderIDFromList.
Scegliere OK.
Gestore eventi per la modifica dell'indice selezionato della casella di riepilogo
L'ultima fase di questa implementazione consiste nel connettere la selezione dell'utente di una chiave di identità per un elemento SalesOrderHeader a una query che restituisce le proprietà di tutte le entità SalesOrderDetail associate all'elemento SalesOrderHeader selezionato.
È stata configurata la query per la restituzione delle proprietà: SalesOrderDetailID, OrderQty, ProductID, UnitPrice e ModifiedDate. Il controllo EntityDataSource viene configurato per ottenere un parametro dal controllo labelHeaderIDFromList nella pagina Web e per fornirlo a una clausola Where della query che identifica l'elemento SalesOrderHeader associato a entità SalesOrderDetail le cui proprietà verranno visualizzate. A questo punto è necessario aggiungere codice che imposti la proprietà Text del controllo labelHeaderIDFromList sulla chiave di identità di un elemento SalesOrderHeader selezionato dall'utente.
Per creare un gestore eventi per l'evento SelectedIndexChanged di ListBox1:
Selezionare ListBox1 nell'area di progettazione della pagina Web.
Fare clic con il pulsante destro del mouse su ListBox1, quindi selezionare Proprietà.
Nell'elenco Proprietà fare clic sull'opzione relativa agli eventi.
Fare doppio clic sull'evento SelectedIndexChanged. In tal modo viene aperta la pagina code-behind ASP.NET, Default.aspx.cs o Default.aspx.vb, e viene visualizzato il blocco di codice per il gestore eventi.
Creare il gestore eventi mostrato nel blocco di codice che segue il passaggio 6. Il codice nel gestore imposta il valore di labelHeaderIDFromList sul valore selezionato dall'utente in ListBox1 e assegna la proprietà DataSource di GridView1 a EntDataSrcOrder. Infine, chiama il metodo DataBind in EntDataSrc_OrderDetails. Il controllo è stato configurato per eseguire query sui dati in base a una chiave di identità di labelHeaderIDFromList.
Impostare la proprietà AutoPostBack di ListBox1 su true, in modo che il server possa leggere la selezione non appena viene effettuata.
protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
labelHeaderIDFromList.Text = ListBox1.SelectedValue;
GridView1.DataSource = EntDataSrc_OrderDetails;
GridView1.DataBind();
}
Quando viene generato l'evento SelectedIndexChanged, viene eseguita la query predefinita con la clausola Where con parametri. Le proprietà visualizzate in GridView1 sono quelle delle entità SalesOrderDetail associate all'elemento SalesOrderHeader selezionato in ListBox1.
Markup della pagina di tutti i controlli
Il markup della pagina riportato di seguito contiene tutti i controlli e le proprietà inizializzati nell'applicazione che visualizza le entità SalesOrderDetail associate a un elemento SalesOrderHeader che si sta compilando. La clausola Where include un parametro che contiene la chiave esterna dell'elemento SalesOrderHeader associato alle entità SalesOrderDetail.
<body>
<form id="form1" >
<div style="height: 450px">
<br />
<asp:ListBox ID="ListBox1"
Height="275px"
Width="100px"
style="position:absolute; left:50px; top:80px"
DataSourceID="EntDataSrc_OrderID" DataTextField="SalesOrderID"
DataValueField="SalesOrderID" AutoPostBack="True"
onselectedindexchanged="ListBox1_SelectedIndexChanged" >
</asp:ListBox>
<asp:GridView ID="GridView1"
style="position:absolute; left:200px; top:75px">
</asp:GridView>
<asp:Label ID="Label1"
Text="Select SalesOrderHeaderID"></asp:Label>
<asp:Label ID="Label2" Text="SalesOrderHeaderID:"></asp:Label>
<asp:Label ID="labelHeaderIDFromList" ></asp:Label>
</div>
<asp:EntityDataSource ID="EntDataSrc_OrderID"
ConnectionString="name=AdventureWorksEntities"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderHeader">
</asp:EntityDataSource>
<asp:EntityDataSource ID="EntDataSrc_OrderDetails"
ConnectionString="name=AdventureWorksEntities"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderDetail"
Select="it.[SalesOrderDetailID], it.[OrderQty],
it.[ProductID], it.[UnitPrice], it.[ModifiedDate]"
Where="it.[SalesOrderID] = @parSalesOrderID">
<WhereParameters>
<asp:ControlParameter Name="parSalesOrderID" ControlID="labelHeaderIDFromList" Type="Int32"/>
</WhereParameters>
</asp:EntityDataSource>
</form>
</body>
Implementazione con CommandText
Nel markup della sezione precedente viene illustrata un'implementazione che utilizza una clausola Where per visualizzare le entità SalesOrderDetail associate a un elemento SalesOrderHeader. Gli stessi risultati possono essere ottenuti da CommandText con una query Entity SQL. Il parametro, in questo caso, viene utilizzato con una query che contiene una correlazione sinistra. Tale correlazione trova le proprietà di entrambe le entità SalesOrderHeader e SalesOrderDetail.
<body>
<form id="form1" >
<div style="height: 430px; width: 805px">
Search Sales Orders <br />
Select Order ID:
<br />
<asp:Label ID="LabelHeaderID"
Text="SalesOrderHeaderID:"
style="position:absolute; left:200px; top:40px"></asp:Label>
<asp:Label ID="LabelHeaderIDFromList" Text=""
style="position:absolute; left:375px; top:40px"></asp:Label>
<br />
<asp:ListBox ID="ListBox1"
DataSourceID="EntDatSrc_OrderID"
DataTextField="SalesOrderID"
DataValueField="SalesOrderID" Height="285px"
Width="100px" style="position:absolute;
left:50px; top:80px"
AutoPostBack="True"
onselectedindexchanged="ListBox1_SelectedIndexChanged">
</asp:ListBox>
<asp:GridView ID="GridView1"
style="position:absolute; left:200px; top:80px"
AllowPaging="false">
</asp:GridView>
<br />
</div>
<asp:EntityDataSource ID="EntDatSrc_OrderID"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderHeader"
Select="it.[SalesOrderID]"
ConnectionString="name=AdventureWorksEntities">
</asp:EntityDataSource>
<asp:EntityDataSource ID="EntDatSrcOrderDetails"
DefaultContainerName="AdventureWorksEntities"
CommandText="SELECT soh.SalesOrderID, sod.SalesOrderDetailID,
sod.OrderQty, sod.ProductID, sod.UnitPrice, sod.ModifiedDate
FROM AdventureWorksEntities.SalesOrderHeader
AS soh, soh.SalesOrderDetail AS sod
WHERE soh.SalesOrderID = @parSalesOrderID"
ConnectionString="name=AdventureWorksEntities" >
<CommandParameters>
<asp:ControlParameter Name="parSalesOrderID"
ControlID="LabelHeaderIDFromList" Type="Int32"/>
</CommandParameters>
</asp:EntityDataSource>
</form>
</body>
Vedere anche
Concetti
Finestra di progettazione EntityDataSource