Incredibile. Non posso credere di aver perso ore e ore di debug cercando di risolvere un errore a cui non trovavo una spiegazione logica. Cerco di riassumere.
Sto facendo per un cliente un ASP.NET User Control (un .ascx per intenderci) che contiene una GridView e un LinqDataSource. L'obiettivo è quello di ottenere un controllo per la gestione delle tabelle di look up, riutilizzabile in situazioni diverse, e che non richieda oneri di amministrazione e configurazione troppo elevati. Quando mi è stato chiesto di farlo con tecnologie in RTM (altrimenti avrei usato altri controlli) ho pensato subito che LINQ To Sql potesse soddisfare brillantemente questa richiesta grazie anche all'editor visuale che permette di trascinare le tabelle direttamente sul ORM mapper che si apre creando un file di tipo LINQ to Sql Classes (.dbml).
Come previsto la facilità di creazione del controllo è stata inizialmente rispettata fino a quando non ho iniziato a testare il cambio di DataContext (necessario per soddisfare uno dei requisiti del progetto e cioè la riutilizzabilità del componente). Da quel momento è iniziato un calvario in debug. Ho riscritto il codice almeno una dozzina di volte pensando che fosse dovuto a qualche errata sequenza di impostazioni che stavo eseguendo. Macché, continuavo a ricevere questo errore:
Could not find a property or field called 'Supplier' on the data context type 'NorthwindDataContext' of LinqDataSource 'ldsMain'.
Ma il tipo Supplier esisteva nel NorthwindDataContext e quindi non capivo il perchè dell'eccezione. Sono tornato al precedente DataContext ed ho aggiunto una tabella e di nuovo, ma solo per la tabella nuova, ancora lo stesso errore:
Could not find a property or field called 'ProductModel' on the data context type 'AWLDataContext' of LinqDataSource 'ldsMain'.
Dopo aver cercato in lungo e in largo; in un momento di rara lucidità ho trovato l'arcano. Mi sono ricordato che da qualche parte avevo letto che LINQ To Sql pluralizza il nome delle tabelle. Tra me e me ho pensato ma va, vuoi che sia proprio quello? Io sono un patito della normalizzazione ma mai e poi mai mi sognerei di farlo in modo così subdolo. Ed invece era proprio quello: le tabelle con nome al singolare non generavano un entità utilizzabile a run-time. Mi è bastato plurarizzare il nome delle classi dal designer e tutto ha iniziato a funzionare come atteso. Ecco un esempio della modifica da apportare:
NON FUNZIONA
FUNZIONA
Non ho parole. O meglio le ho ma non è il caso che le scriva.