pomeriggio entity framework - code first

18
Entity Framework 4.1 – Code First Pietro Libro, Fondatore DomusDotNet [email protected] Roma, 7 Ottobre 2011

Upload: domusdotnet

Post on 22-May-2015

1.209 views

Category:

Technology


2 download

DESCRIPTION

Sessione dell'evento "Pomeriggio Entity Framework" dedicata a Entity Framework Code First tenuta da Pietro Libro.

TRANSCRIPT

Page 1: Pomeriggio Entity Framework - Code First

Entity Framework 4.1 – Code First

Pietro Libro, Fondatore [email protected]

Roma, 7 Ottobre 2011

Page 2: Pomeriggio Entity Framework - Code First

• Configuration & Mapping• Validazione• Proprietà, Persistenza e Query• Concorrenza

Agenda

Page 3: Pomeriggio Entity Framework - Code First

• 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

Page 4: Pomeriggio Entity Framework - Code First

• 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

Page 5: Pomeriggio Entity Framework - Code First

• 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

Page 6: Pomeriggio Entity Framework - Code First

• Attributi • MaxLenght• Key• DataType• …

• L’utilizzo degli attributi può rendere «difficile» la lettura del codice della definizione del nostro modello dati.

Configuration & Mapping

Page 7: Pomeriggio Entity Framework - Code First

• 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

Page 8: Pomeriggio Entity Framework - Code First

• 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

Page 9: Pomeriggio Entity Framework - Code First

• 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

Page 10: Pomeriggio Entity Framework - Code First

• 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

Page 11: Pomeriggio Entity Framework - Code First

• 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

Page 12: Pomeriggio Entity Framework - Code First

• 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à

Page 13: Pomeriggio Entity Framework - Code First

• 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à

Page 14: Pomeriggio Entity Framework - Code First

Abbiamo visto nella sessione di Alessandro l’utilizzo di LINQ per l’interrogazione dei dati.

Persistenza e Query

Page 15: Pomeriggio Entity Framework - Code First

• 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

Page 16: Pomeriggio Entity Framework - Code First

• 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

Page 17: Pomeriggio Entity Framework - Code First

• 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)

Page 18: Pomeriggio Entity Framework - Code First

• 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