277 messaggi dal 03 ottobre 2006
l'errore è il seguente
DataBinding: 'SkipperClub.Models.EventoTesserati' non contiene una proprietà con nome 'Id'

ma è corretto riferisci alla proprietà id dell'oggetto Evento con la sintassi qui sotto?
<asp:GridView ID="GridView1" runat="server" EnableViewState="false"
PageSize="15" DataKeyNames="Ev.Id" OnCallingDataMethods="EventiList_CallingDataMethods"
AutoGenerateColumns="false" SelectMethod="GetEventiItems1"
ItemType="SkipperClub.Models.EventoTesserati">
<Columns>
<asp:BoundField DataField="Ev.Id" HeaderText="Id" />
</Columns>
</asp:GridView>
11.886 messaggi dal 09 febbraio 2002
Contributi
Uhm, sembra che non sia possibile indicare proprietà annidate come DataKeyNames.
Dovresti creare una nuova proprietà in EventoTesserati come la seguente:
public string Id { get { return Ev.Id; } }

Oppure, se usi una delle recenti versioni di C#:
public string Id => Ev.Id;


Se preferisci non sporcare così le entità, vale la pena di creare questa proprietà nel Dto.

ciao,
Moreno

Enjoy learning and just keep making
277 messaggi dal 03 ottobre 2006
Questa cosa continua a non funzionare... ho provato a semplificare usando le cose che sto imparando in questo modo:
2 entità:
public class Barca
{
public int BarcaID { get; set; }
public string Base { get; set; }
public virtual ICollection<Evento> Eventi { get; set; }
}

public class Evento
{
[Key]
public int Id { get; set; }
public virtual ICollection<Barca> Barche { get; set; }
}

Questo per realizzare una relazione molti a molti, infatti viene creata automaticamente nel DB una tabella:
dbo.eventobarcas con 2 colonne:
Evento_Id
Barca_BarcaID
entrambe come chiavi primarie e secondarie

poi ho fatto una classe DTO seguente
public class BarcaxeventoDTO
{
public int eventoid { get; set; }
public ICollection<Barca> barche { get; set; }
}

Questa la GridView
<asp:GridView ID="BarcheList" runat="server" EnableViewState="true"
ItemType="SkipperClub.Models.BarcaxeventoDTO" SelectMethod="BarcaList_GetData"
AutoGenerateColumns="False">
<Columns>
<asp:TemplateField>
<HeaderTemplate>Base</HeaderTemplate>
<ItemTemplate><asp:Label ID="lblRoomType" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "barche.Base") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="eventoid" HeaderText="Id" />
</Columns>

e questa la query che dovrebbe mostrarmi le barche associate all'evento (ho provato manualmente a popolare la tabella dbo.eventobarcas mettendo a caso un Evento_id e un Barca_BarcaID)
public IQueryable<BarcaxeventoDTO> BarcaList_GetData(int idevento)
{
IQueryable<BarcaxeventoDTO> query = _db.ListEventi.Select(s => new BarcaxeventoDTO
{
eventoid = s.Id,
barche = s.Barche,
}).Where(s => s.eventoid == idevento);
return query;
}

e questo l'errore che ricevo sulla riga dove ho la label nella gridview
DataBinding: 'System.Collections.Generic.HashSet`1[[SkipperClub.Models.Barca, SkipperClub, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' non contiene una proprietà con nome 'Base'.

Se lascio solo la proprietà eventoid nella gridview funziona tutto e la query eseguita su Linq4 mi da il risultato che vorrei....

Non ho più idee...
11.886 messaggi dal 09 febbraio 2002
Contributi
Se ti è possibile crea un progetto minimale che contenga giusto il codice che hai postato, poi condividilo su Google Drive o OneDrive. Fai in modo che funzioni senza database, cioè con dati cablati nel codice, tanto è una demo.

Enjoy learning and just keep making
277 messaggi dal 03 ottobre 2006
Non credo di essere in grado senza DB, dovrei capire come cambiare le query...
Cercherò ancora online possibili soluzioni
Grazie lo stesso
277 messaggi dal 03 ottobre 2006
comunque ho provato a fare anche il log della query trasformata in SQL server ed è perfetta nel senso che eseguita su Management Studio restituisce esattamente una riga contenente eventoid e tutte le colonne di ICollection<Barca> barche della classe DTO solo che questa collection non viene misteriosamente digerita dalla gridview
che strazio


SELECT
[Project1].[Id] AS [Id],
[Project1].[C1] AS [C1],
[Project1].[BarcaID] AS [BarcaID],
[Project1].[Modello] AS [Modello],
[Project1].[Anno] AS [Anno],
[Project1].[Bandiera] AS [Bandiera],
[Project1].[Base] AS [Base],
[Project1].[Nome] AS [Nome],
[Project1].[Cabine] AS [Cabine],
[Project1].[Bagni] AS [Bagni],
[Project1].[Letti] AS [Letti],
[Project1].[Postiomol] AS [Postiomol],
[Project1].[Note] AS [Note],
[Project1].[Ccosto] AS [Ccosto],
[Project1].[Regione] AS [Regione],
[Project1].[SkipperId] AS [SkipperId],
[Project1].[SkipperIdpref] AS [SkipperIdpref]
FROM ( SELECT
[Extent1].[Id] AS [Id],
[Join1].[BarcaID] AS [BarcaID],
[Join1].[Modello] AS [Modello],
[Join1].[Anno] AS [Anno],
[Join1].[Bandiera] AS [Bandiera],
[Join1].[Base] AS [Base],
[Join1].[Nome] AS [Nome],
[Join1].[Cabine] AS [Cabine],
[Join1].[Bagni] AS [Bagni],
[Join1].[Letti] AS [Letti],
[Join1].[Postiomol] AS [Postiomol],
[Join1].[Note] AS [Note],
[Join1].[Ccosto] AS [Ccosto],
[Join1].[Regione] AS [Regione],
[Join1].[SkipperId] AS [SkipperId],
[Join1].[SkipperIdpref] AS [SkipperIdpref],
CASE WHEN ([Join1].[Evento_Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
FROM [dbo].[Eventoes] AS [Extent1]
LEFT OUTER JOIN (SELECT [Extent2].[Evento_Id] AS [Evento_Id], [Extent3].[BarcaID] AS [BarcaID], [Extent3].[Modello] AS [Modello], [Extent3].[Anno] AS [Anno], [Extent3].[Bandiera] AS [Bandiera], [Extent3].[Base] AS [Base], [Extent3].[Nome] AS [Nome], [Extent3].[Cabine] AS [Cabine], [Extent3].[Bagni] AS [Bagni], [Extent3].[Letti] AS [Letti], [Extent3].[Postiomol] AS [Postiomol], [Extent3].[Note] AS [Note], [Extent3].[Ccosto] AS [Ccosto], [Extent3].[Regione] AS [Regione], [Extent3].[SkipperId] AS [SkipperId], [Extent3].[SkipperIdpref] AS [SkipperIdpref]
FROM [dbo].[EventoBarcas] AS [Extent2]
INNER JOIN [dbo].[Barcas] AS [Extent3] ON [Extent3].[BarcaID] = [Extent2].[Barca_BarcaID] ) AS [Join1] ON [Extent1].[Id] = [Join1].[Evento_Id]
WHERE [Extent1].[Id] = @p__linq__0
) AS [Project1]
ORDER BY [Project1].[Id] ASC, [Project1].[C1] ASC
11.886 messaggi dal 09 febbraio 2002
Contributi

DataBinding: 'System.Collections.Generic.HashSet`1[[SkipperClub.Models.Barca, SkipperClub, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' non contiene una proprietà con nome 'Base'.

Questo errore è normale: la proprietà "barche" è una collezione (ti dice infatti che è un HashSet) e non ha una proprietà Base. E' su ciascuno dei suoi elementi che si trova la proprietà "Base".
Probabilmente volevi usare la proprietà "barche" come Data source per un GridView innestato nel primo?


comunque ho provato a fare anche il log della query trasformata in SQL server ed è perfetta

Infatti qui il problema non è la query linq o entity framework, ma il modo in cui i dati vengono presentati nella gridview. Per quello ti chiedevo di ricreare un progetto senza database.
Modificato da BrightSoul il 12 novembre 2018 19.54 -

Enjoy learning and just keep making
277 messaggi dal 03 ottobre 2006
Ciao Moreno
ti ingrazio per la risposta, nel frattempo stavo provando a fare una prova senza DB anche se forse non sarà necessario perchè dalle tue parole mi rendo conto che effettivamente non avevo precisato l'obiettivo finale.
Ebbene si, vorrei usare la proprietà di navigazione "barche" come sorgente di una gridview ed effettivamente "base" è una proprieta scalare dell'entità di cui "barche" ne è la proprietà di navigazione.
Quindi ho due Entità: Evento e Barca in una relazione molti a molti che contengono rispettivamente:

public virtual ICollection<Barca> Barche { get; set; }
public virtual ICollection<Evento> Eventi { get; set; }

Il sistema crea una tabella contenente correttamente le due chiavi primarie delle due tabelle

Ho un metodo che esegue una query perfetta nel senso che mi restituisce la join fra le due tabelle in base ad un certo idevento e questa join la "carico" su un DTO...(BarcaxeventoDTO) l'unico problema è che il metodo seguente che esegue la query non può fare da sorgente alla gridview per mostrare i dati contenuti nella proprietà di navigazione barche.

IEnumerable<BarcaxeventoDTO> query = _db.ListEventi.Include("Barche").Select(s => new BarcaxeventoDTO
{
eventoid = s.Id,
barche = s.Barche,
}).Where(s => s.eventoid == idevento);
return query.ToList();

Deduco che esista una'altra sintassi della query per far si che possa diventare una sorgente per la gridview ?

qui hanno la mia stessa esigenza e mi pare che usino il mio stesso approccio me che a loro funzioni...
https://stackoverflow.com/questions/8881028/how-to-bind-the-grid-view-to-complex-object

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.