3. Configuration & Mapping L’origine di tutto: la classe DbContext I passi minimi nell’approccio Code First: Costruire le classi che definiscono l’object Model asData Model (Importante: Code First NON è DDD ) Costruire una classe derivata da DbContext(gateway per l’accesso all’entità e dati) ed esporre proprietà System.Data.Entity.DataSet<> per ognuna delle classi dell’Object Model Se ci basiamo solo sulle convezioni nient’altro.
4. Configuration & Mapping Quali convezioni? Nome database e stringa di connessione Di default: «LocalhostQLEXPRESS», Full QualifiedTypeName del DbContextderivato Override: aggiungere App.Config o Web.Config con una stringa di connessione Custom il cui nome è uguale al DbContext derivato
5. Configuration & Mapping Quali convezioni ? Per il mapping delle colonne abbiamo convezioni per: Chiave primarie Nomi delle tabelle Nomi delle colonne Nomi delle relazioni ForeignKey Tipi Ecc… Possiamo cambiarle ? Ovviamente si: Utilizzando gli attributi del System.ComponentModel.Annotations Fluent API Elenco delle convenzioni Code First http://msdn.microsoft.com/en-us/library/hh161541%28VS.103%29.aspx
6.
7.
8. Configuration & Mapping Inizializzazione del database Cancella e crea in ogni caso Database.SetInitializer<Db>(new DropCreateDatabaseAlways<Db>()); Crea se non esiste Database.SetInitializer<Db>(new CreateDatabaseIfNotExists<Db>()); Cancella e crea se il modello cambia (Attenzione!) Database.SetInitializer<Db>(new DropCreateDatabaseIfModelChanges<Db>()); Strategia Custom Database.SetInitializer<Db>(new DbCustomDatabaseStrategy()); DEMO
9. Validazione Perché ‘Validare ?’ Dati corretti Risparmiare round trip sul server (SQL Azure) In EF 4.1 Abilitata per default Utilizza attributi (DataAnnotations.ValidationAttribute) Validazione automatica dei ComplextType Supporta l’interfaccia IValidatableObject Attributi su NavigationProperties e Collection (validità della proprietà e non degli elementi)
10.
11. Proprietà Per ogni proprietà di un’entità: Current Value (getet) Context.Entry(entity).Property(n=>n.name).CurrentValue Original Value (getet) Context.Entry(entity).Property(n=>name).OriginalValue Verificare proprietà modificate: Context.Entry(entity).Property(n=>n.name).IsModified (Getet) Forzare l’Updatedurante il SaveChanges() anche se Original Value e Current Value coincidono Current, Original e Database Values: Context.Entry(entity).CurrentValues() Context.Entry(entity).OriginalValues() Context.Entry(entity).GetDatabaseValues()
12. Proprietà Original e CurrentValues da un altro oggetto: Consideriamo un DTO del tipo: new Book {Title=‘Pippo’ , ISBN=‘Franco’}; Il DTO viene utilizzato da Services Layerper la comunicazione tra strati Valorizzare la entity da modificare Context.Entry(entity).CurrentValues.SetValues(dto) DEMO
13. Persistenza e Query Abbiamo visto nella sessione di Alessandro l’utilizzo di LINQ per l’interrogazione dei dati.
20. Concorrenza Concorrenza (ottimistica): Specifichiamo le proprietà interessate Attributo [ConcurrencyCheck] Due possibili strategie: StoreWins Utilizziamo il metodo Reload() per sovrascrivere i dati dell’entity con quelli presenti nel database Client Wins Sostituiamo i valori originali dell’entity con quelli del database GetDatabaseValues() (eliminazione delle incogruenze) DEMO
21. Futuro (Entity Framework 4.2) Rilasciata la CTP a Giugno 2011 e la Beta 1 ad Agosto 2011 Enum SpatialType Table-Valuedfunctions Stored Procedure con result sets multipli Ottimizzazione delle query nei modelli Table-per-Type (TPT) Query Linq automaticamente compilate e «cached» Entity Data Model con diagrammi multipli Stored Procedure mappate automaticamente a ComplexType Miglioramenti e aggiunge di funzionalità all’Entity Data Designer Code First Sql Migration Evoluzione del database in sincronia con l’evoluzione del modello Code First
22. Link utili Entity Framework 4.1 Download: http://www.microsoft.com/download/en/details.aspx?id=8363 Blog Personale: http://blogs.ugidotnet.org/PietroLibroBlog Blog EntityFramework Design: http://blogs.msdn.com/b/efdesign Ado.NetTeam Blog: http://blogs.msdn.com/b/adonet DomusDotNet : http://www.domusdotnet.org