205 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.050 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
205 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.050 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
205 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
205 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.050 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

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.