CSharp:EntityFramework
From Aino Wiki
Contents
Teoria
ER è un framework ORM (Object/Relational Mapping) messo a disposizione dal Microsoft .NET Framework.
Questo framwork si interpone tra un DataBase ed il livello di applicazione\dominio fornendo facilitazioni per le operazioni CRUD, in altri termini nasconde il funzionamento di un database relazionale, permetterci di pensare al nostro modello dei dati come ad un insieme di oggetti direttamente accessibili dal codice dell'applicativo.
Recupera e manipola dati usando oggetti fortemente tipizzati.
EF introduce un approccio Code-First, con ciò ci si concentra nel progetto di codifica del dominio creando le Entità dell'applicativo piuttosto che quelle del DataBase. Con l'approccio Code-First dell'EF il DataBase sarà creato al volo basandosi sulle classi\Entità e configurazioni nel codice sorgente dell'applicativo.
Nel codice vedere la cartella con il diagramma edmx (Entity Data Model x)
Considerazioni
Svantaggi': social.msdn.microsoft.com
L’accesso ai dati con Entity Framework anche se giova in fase di sviluppo, che ne velocizza di tempi, appesantisce in fase di manutenzione. Astraendo la base dati, impone che ogni modifica strutturale sia riverberata su entrambe i livelli. Occorrerà fare attenzione a tenere allineati entrambi i livelli, sovente è causa di aggiornamenti di versione non voluti complicando la diagnosi di problemi. Altra obiezione è la scarsa scalabilità (The number in a Microsoft screencast is a maximum of roughly 250 tables per EF model).
Unfortunately, the EF queries are generated by the provider that we cannot control. For some specified query that you want to customize, you can try DataContext.ExecuteQuery(string query, params object[] parameters).
Materiale
Tutorial con concetti:entityframeworktutorial.net
Codice visto come esempio: codeproject.com
Da un progetto Visual Studio si può aggiungere un "New Item" ADO.NET Entity Data Model, es chiamandolo LearnEF avremo creato un LearnEF.edmx (Entity Data Model x)
HowTo
Configurazione del DB puntato
Occorre riaggiornare il modello (file *.edmx), qual'è il file di configurazione a cui si punta attualmente?
Esempi
Tips
Transazioni
Articolo che parla di come il SaveChanges(), AcceptAllChanges() possa creare inconsistenze allorché si rende necessaria una transazione: blog MSDN
Occorre aggiungere la reference a System.Transactions
Pseudocodice:
using System.Transactions; // !!! //.. using (TransactionScope scope = new TransactionScope()) { //Do something with context1 //Do something with context2 //Save Changes but don't discard yet context1.SaveChanges(false); //Save Changes but don't discard yet context2.SaveChanges(false); //if we get here things are looking good. scope.Complete(); //If we get here it is save to accept all changes. context1.AcceptAllChanges(); context2.AcceptAllChanges(); }
Allineamento del DB
Per rifare\aggiornare il binding con la basedati:
- selezioanre il file
*.edmx
, doppio click; - del file aperto aprire il menu contestuale
- selezioanre "Update Model from DataBase..."
Quest'ultima selezione nel tipo di sviluppo "database first", come segue:
Infine la scelta degli ogetti da aggiornare:
NOTE
Può darsi che precedentemente non tutti gli oggetti siano stati inclusi nel modello pertanto con questa operazione si da per scontato l'aggiornamento di quelli già esistenti e EVENTUALMENTE l'aggiunta, mediante la selezione con le check box, di oggetti del DB aggiunti rispetto l'ultimo aggiornamento
Allineamento StoredProcedure
Esiste un caso particolare in cui l'aggiornamento delle SP possa fallire ovvero quando non è chiaro cosa la restituisca.
Es., quando la SP esegue una query dinamica contenuta in una variabile stringa. In questi casi esiste un "trucco" per fargli capire cosa restituisca, basta aggiungere in alto allo script quanto segue:
--Testata della SP -- BEGIN EF Mapping IF 1=0 BEGIN SELECT CAST(NULLAS DATETIME) AS 'DT_INSERT' ,CAST(NULLAS NVARCHAR(50)) AS 'USERINSERT' ,CAST(NULLAS DATETIME) AS 'DT_UPDATE' ,CAST(NULLAS NVARCHAR(50)) AS 'USERUPDATE' ,CAST(NULLAS UNIQUEIDENTIFIER) AS 'ROWGUID' END -- END EF Mapping --Selezione, immaginandola su tabelle temporanee o risultato di un EXECUTE @ScriptSQL SELECT DT_INSERT, etc, GUID FROM #Tabella
Errori e soluzioni
Riferimento ad una Tabella non aggiornato
Può capitare che in seguito a modifiche ad una tabella, rinominata o per altre modifiche, il suo riferminento sia sparito, purtroppo per quanto si sia aggiornato il modello questo errore sembra inspiegabile. Ecco come correggerlo, a posteriori comunque verificare da FileSystem che i files della classe siano cancellati e richreati correttamente.
Mappa e Link
Parole chiave: Entity Framework , EF