Scrivere operazioni CRUD di base è molto semplice se utilizziamo Entity Framework 6 e la sua desinenza “Database First” in accoppiata alle fuzionalità di scaffolding di MVC 5 che ci evitano di scrivere una riga di codice.
Per applicare la modalità “Database First” Visual Studio 2013, anche versione Express per Web, offre un comodo designer per generare un data model completo di classi con proprietà a partire dallo schema di un database con le relative tabelle e relazioni, il tutto salvato in un file xml avente estensione .edmx.
Per la creazione del database possiamo utilizzare un DbLocal creando un progetto Database Project:
il quale si presenterà come un progetto vuoto dove potremo aggiungere le tabelle del nostro database e uno script di post deployment che ci permetterò di aggiungere dei dati di test per il nostro database dopo aver fatto il deploy del progetto, attraverso l’esecuzione del progetto, che si occuperà della creazione del database.
MERGE INTO Category AS Target USING (VALUES (1, 'PRI'), (2, 'PEN') ) AS Source (IdCategoria, Descrizione) ON Target.IdCategoria = Source.IdCategoria WHEN NOT MATCHED BY TARGET THEN INSERT (IdCategoria, Descrizione) VALUES (IdCategoria, Descrizione); MERGE INTO Contracts AS Target USING (VALUES (1,GETDATE(), GETDATE(), 1) ) AS Source (IdContratto,DataContratto,DataScadenza,IdCategoria) ON Target.IdContratto = Source.IdContratto WHEN NOT MATCHED BY TARGET THEN INSERT (IdContratto,DataContratto,DataScadenza,IdCategoria) VALUES (IdContratto,DataContratto,DataScadenza,IdCategoria); MERGE INTO Customers AS Target USING (VALUES (1,'MRORSS69E27H501L', 'MARIO','ROSSI', '1969-05-27','M') ) AS Source (IdContratto,CodiceFiscale,Nome,Cognome,DataNascita,Sesso) ON Target.CodiceFiscale = Source.CodiceFiscale WHEN NOT MATCHED BY TARGET THEN INSERT (IdContratto,CodiceFiscale,Nome,Cognome,DataNascita,Sesso) VALUES (IdContratto,CodiceFiscale,Nome,Cognome,DataNascita,Sesso);
N.B. attenzione che ogni qualvolta eseguite il progetto lo script post deploy viene eseguito
Di seguito la struttura del progetto dopo aver aggiunto le tabelle e lo script di deploy
Dal Sql Server Objects Explorer possiamo notare la struttura del database creato nel database server locale, in questo caso (localdb)ProjectsV12:
A questo punto siamo pronti per creare la nostra applicazione web MVC 5 per lo scopo prefissato. Una volta creata la soluzione si dovrà scaricare, tramite Nuget, Entity Framework giunto alla versione 6.1, in questo modo sarà possibile creare un modello dati sulla base del database appena creato. Per far questo aggiungiamo nella cartella Model un file di tipo .edmx
alla finestra successiva scegliamo di farci creare la nostra classe model dal database, quindi definiamo la stringa di connessione e via via gli altri parametri .
Quindi scegliamo le tabelle che saranno le nostre entità e salviamo la nostra classe model con un namespace a piacere
La nostra solution conterrà adesso diversi file in più mentre in automatico apparirà il designer di EF con le classi appena create.
In particolare la classe BankDataModelContext, che eredita dalla classe DbContext , fornisce una proprietà di tipo DbSet per ogni modello collegato alle tabelle scelte per la generazione. Prima di proseguire dobbiamo effettuare la build del progetto altrimenti per la prossima attività di creazione automatica del codice CRUD in seguito alla attività di scaffolding che faremo non otterremo nulla.
I passaggi per terminare l’attività sono semplici e si possono riassumere nel seguente modo:
- aggiungere un controller di tipo Scaffolded come da esempio:
- nella maschera successiva proseguire :
- quindi scegliere la classe che fungerà da controller presa dal datacontext appena generato
Ripetere l’operazione per tutte le classi per cui si devono fare operazioni CRUD, nel nostro caso Customers e Category e otterremo una solution del genere:
Come possiamo vedere all’interno dei controllers troviamo tutte le operazioni CRUD sul model scelto, inoltre è stata creata per noi la view corrispondente, non ci rimane che agganciarle al nostro menu
@Html.ActionLink("Contracts", "Index", "Contracts") @Html.ActionLink("Customers", "Index", "Customers") @Html.ActionLink("Categories", "Index", "Categories")
Siamo pronti per lavorare!