Beren.it

All that you can leave behind

Dynamic Data Entities - Customization Parte 1 - Name & Scaffolding

In un post di qualche giorno fa illustravo la facilità con cui realizzare una web application per il data entry attraverso l'utilizzo dei Dynamic Data Entities. Ora proseguo in questo argomento illustrando come procedere con la customizzazione di quanto automaticamente prodotto dal template di Visual Studio. Apriamo ad esempio la pagina principale dell'applicazione.

Effettivamente la web application ha l'elenco completo delle tabelle come si vede dall'immagine qui sopra. Però supponiamo che non tutte le tabelle siano da visualizzare. Per nascondere o visualizzare le tabelle bisogna agire sulla proprietà di ScaffolAllTables che abbiamo già visto essere settata all'interno del file Global.asax. Essa infatti se settata a true informa il framework che tutte le tabelle presenti nello schema edmx devono esssere visualizzabili.

[C#]

    DefaultModel.RegisterContext(typeof(FOFEntities), 
    new ContextConfiguration() { ScaffoldAllTables = false });

Settiamo dunque a False tale property, ma questo non basta infatti se lanciamo l'applicazione verrà sollevata un'eccezione. In effetti l'applicazione in questo modo non ha nessuna table da visualizzare, quindi bisogna trovare una maniera per informare il framework quale tabele specifiche mostrare dal momento che non le deve visualizzare tutto. In generale questo tipo di operazioni di customizzazione si applicano all'entity framework decorando le classi con attributi specifici. Ad esempio se volessimo indicare una tabella, o meglio la classe che la rappresenta nel file edmx, come visualizzabile dall'applicazione dovremmo usare l'attributo ScaffoldTable(true) e collocarlo appena prima della dichiarazione. Non è però nelle best practice questa operazione, inquanto dovrebbe andare a modificare un file autogenerato qual'è il Designer del edmx. Infatti se la struttura del database cambiasse per una qualche ragione e volessimo aggiornare il file edmx attraverso l'interfaccia del designer, tutte le modifiche apportate manualmente andrebbero perse...
Che fare dunque? Fortunatamente le Partial Classes di .NET ci vengono in aiuto e ci forniscono un efficiente workaround al problema consentendo di separare in un altro file tutte le personalizzazioni realizzate manualmente. Aggiungendo infatti un file cs al progetto. A questo punto prendiamo il nome della classe che si riferisce alla tabella che vogliamo visualizzare e ne scriviamo la definizione partial. In questa classe però non andremmo a specificare nient'altro ad esccezione di un attributo MetadataType che serve a linkare alla classe stessa una classe di metadata appunto.

[C#]

    [MetadataType(typeof(TB_SEASONMetadata))]
    public partial class TB_SEASON
    {

    }

    [ScaffoldTable(true)]
    [TableName("Stagione")]
    public class TB_SEASONMetadata
    {
        ...
    }

E' in questa classe di metadata che andremo a specificare tutte le customizzazioni che ci interessano. In particolare nel nostro caso sfrutteremo il già sopra citato attributo ScaffoldTable(true) che indica al framework che questa classe è gestibile dal sistema ed un altro attribute di nome TableName che serve a rinominare la tabella e nel nostro caso utilizzeremo per passare dal nome poco user-friendly "TB_SEASON" a "Stagione". Compiliamo, refreshamo la pagina. Ed otteniamo il risultato desiderato. Una sola tabella visualizzata nell'elenco e con un nome maggiormente esplicativo.