Post on 22-May-2015
description
Entity Framework 4.1 – Code First
Pietro Libro, Fondatore DomusDotNetpietro.libro@domusdotnet.org
Roma, 7 Ottobre 2011
• Configuration & Mapping• Validazione• Proprietà, Persistenza e Query• Concorrenza
Agenda
• L’origine di tutto: la classe DbContext• I passi minimi nell’approccio Code First:
– Costruire le classi che definiscono l’object Model as Data 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.
Configuration & Mapping
• Quali convezioni ?
– Nome database e stringa di connessione• Di default: «Localhost\SQLEXPRESS», Full Qualified Type Name del
DbContext derivato• Override: aggiungere App.Config o Web.Config con una stringa di
connessione Custom il cui nome è uguale al DbContext derivato
Configuration & Mapping
• Quali convezioni ? – Per il mapping delle colonne abbiamo convezioni per:
• Chiave primarie• Nomi delle tabelle• Nomi delle colonne• Nomi delle relazioni• Foreign Key• 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
Configuration & Mapping
• Attributi • MaxLenght• Key• DataType• …
• L’utilizzo degli attributi può rendere «difficile» la lettura del codice della definizione del nostro modello dati.
Configuration & Mapping
• Fluent Api• Stesse funzionalità di mapping degli attributi• Necessarie per scenari di mapping più complessi (nel 99,99 % dei
casi reali )– Entity Splitting (1 entità «spalmata» su N tabelle)– Gerarchie di Ereditarietà
» Table per Class» Table per Class Hierarchy» Table per Concrete Class
– Table Splitting (1 tabella «spalmata» su N entità)
• Configurazione & mapping concentrato in un solo punto:– Override OnModelCreating della classe DbContext
Configuration & Mapping
• Durante la fase di «mapping» possiamo utilizzare la collezione Configurations per:• Aggiungere nuove configurazioni a quelle già presenti
– Classi derivate da EntityTypeConfiguration<> o ComplexTypeConfiguration<> secondo dei casi
• Rimuovere configurazioni esistenti
• Possiamo utilizzare la collezione Conventions per rimuovere le convenzioni esistenti:• modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()• Pluggable Conventions non supportate (in questa versione)
• Per ogni istanza della classe derivata da DbContext, tramite la proprietà Configuration possiamo impostare (abilitate per default):• AutoDetectChangesEnabled • LazyLoadingEnabled• ProxyCreationEnabled• ValidateOnSaveEnabled
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
Configuration & Mapping
• 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 Complext Type– Supporta l’interfaccia IValidatableObject – Attributi su Navigation Properties e Collection (validità della proprietà e
non degli elementi)
Validazione
• Quando viene eseguita ?
– Prima della persistenza dei dati– On-demand per singola entità– On-demand per singola proprietà
• Se la validazione non ha successo:– DbEntityValidationException (EntityValidationErrors)
• DbEntityValidationResult (ValidationErrors)– ValidationError
• Perché non System.ComponentModel.DataAnnotations.Validator?– Non esegue la validazione automatica dei ComplexType
DEMO
Validazione
• Per ogni proprietà di un’entità:– Current Value (get\set)
• Context.Entry(entity).Property(n=>n.name).CurrentValue
– Original Value (get\set)• Context.Entry(entity).Property(n=>name).OriginalValue
• Verificare proprietà modificate:– Context.Entry(entity).Property(n=>n.name).IsModified (Get\Set)– Forzare l’Update durante 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()
Proprietà
• Original e Current Values da un altro oggetto:– Consideriamo un DTO del tipo:
• new Book {Title=‘Pippo’ , ISBN=‘Franco’};
– Il DTO viene utilizzato da Services Layer per la comunicazione tra strati
– Valorizzare la entity da modificare• Context.Entry(entity).CurrentValues.SetValues(dto)
DEMO
Proprietà
Abbiamo visto nella sessione di Alessandro l’utilizzo di LINQ per l’interrogazione dei dati.
Persistenza e Query
• Stored Procedure- Non c’è un supporto diretto al mapping di Stored Procedure come ad
esempio in Model First.- Possiamo utilizzare l’ObjectContext «wrappato» dal DbContext corrente- Oppure
- DbContext.Books.SqlQuery (con Tracking)- DbContext.Database.SqlQuery<Book> (No Tracking)- DbContext.Database.ExecuteSqlCommand("EXECUTE [dbo].
[GetAllProducts]"); (No Tracking)
DEMO
Persistenza e Query
• Concorrenza (ottimistica):– Specifichiamo le proprietà interessate
• Attributo [ConcurrencyCheck]
– Due possibili strategie:• Store Wins
– 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
Concorrenza
• Rilasciata la CTP a Giugno 2011 e la Beta 1 ad Agosto 2011– Enum– Spatial Type– Table-Valued functions– 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 Complex Type– 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
Futuro (Entity Framework 4.2)
• Entity Framework 4.1 Download: http://www.microsoft.com/download/en/details.aspx?id=8363
• Blog Personale: http://blogs.ugidotnet.org/PietroLibroBlog
• Blog Entity Framework Design: http://blogs.msdn.com/b/efdesign
• Ado.Net Team Blog: http://blogs.msdn.com/b/adonet• DomusDotNet : http://www.domusdotnet.org
Link utili