Entity Framework 4.1 – Code First<br />Pietro Libro, Fondatore DomusDotNet<br />pietro.libro@domusdotnet.org<br />Roma, 7 ...
Agenda<br />Configuration & Mapping<br />Validazione<br />Proprietà, Persistenza e Query<br />Concorrenza<br />
Configuration & Mapping<br />L’origine di tutto: la classe DbContext<br />I passi minimi nell’approccio Code First:<br />C...
Configuration & Mapping<br />Quali convezioni?<br />Nome database e stringa di connessione<br />Di default: «LocalhostSQLE...
Configuration & Mapping<br />Quali convezioni ? <br />Per il mapping delle colonne abbiamo convezioni per:<br />Chiave pri...
Configuration & Mapping<br /><ul><li>Attributi </li></ul>MaxLenght<br />Key<br />DataType<br />…<br /><ul><li>L’utilizzo d...
Configuration & Mapping<br /><ul><li>Durante la fase di «mapping» possiamo utilizzare la collezione Configurations per:</l...
Configuration & Mapping<br />Inizializzazione del database<br />Cancella e crea in ogni caso<br />Database.SetInitializer<...
Validazione<br />Perché ‘Validare ?’<br />Dati corretti <br />Risparmiare round trip sul server (SQL Azure)<br />In EF 4.1...
Validazione<br />Quando viene eseguita ?<br />Prima della  persistenza dei dati<br />On-demand per singola entità<br />On-...
Proprietà<br />Per ogni proprietà di  un’entità:<br />Current Value (getset)<br />Context.Entry(entity).Property(n=>n.name...
Proprietà<br />Original e CurrentValues da un altro oggetto:<br /> Consideriamo un DTO del tipo:<br />new Book {Title=‘Pip...
Persistenza e Query<br />Abbiamo visto nella sessione di Alessandro  l’utilizzo di LINQ per l’interrogazione dei dati. <br />
Persistenza e Query<br />Stored Procedure<br /><ul><li>Non c’è un supporto diretto al mapping di Stored Procedure come ad ...
Possiamo utilizzare l’ObjectContext «wrappato» dal DbContext corrente
Oppure
DbContext.Books.SqlQuery(con Tracking)
DbContext.Database.SqlQuery<Book> (No Tracking)
Upcoming SlideShare
Loading in …5
×

Pomeriggio Entity Framework - Code First

1,409 views

Published on

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

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,409
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
78
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Pomeriggio Entity Framework - Code First

  1. 1. Entity Framework 4.1 – Code First<br />Pietro Libro, Fondatore DomusDotNet<br />pietro.libro@domusdotnet.org<br />Roma, 7 Ottobre 2011<br />
  2. 2. Agenda<br />Configuration & Mapping<br />Validazione<br />Proprietà, Persistenza e Query<br />Concorrenza<br />
  3. 3. Configuration & Mapping<br />L’origine di tutto: la classe DbContext<br />I passi minimi nell’approccio Code First:<br />Costruire le classi che definiscono l’object Model asData Model (Importante: Code First NON è DDD  )<br />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<br />Se ci basiamo solo sulle convezioni nient’altro.<br />
  4. 4. Configuration & Mapping<br />Quali convezioni?<br />Nome database e stringa di connessione<br />Di default: «LocalhostSQLEXPRESS», Full QualifiedTypeName del DbContextderivato<br />Override: aggiungere App.Config o Web.Config con una stringa di connessione Custom il cui nome è uguale al DbContext derivato<br />
  5. 5. Configuration & Mapping<br />Quali convezioni ? <br />Per il mapping delle colonne abbiamo convezioni per:<br />Chiave primarie<br />Nomi delle tabelle<br />Nomi delle colonne<br />Nomi delle relazioni<br />ForeignKey<br />Tipi<br />Ecc…<br />Possiamo cambiarle ? Ovviamente si:<br />Utilizzando gli attributi del System.ComponentModel.Annotations<br />Fluent API<br />Elenco delle convenzioni Code First<br />http://msdn.microsoft.com/en-us/library/hh161541%28VS.103%29.aspx<br />
  6. 6. Configuration & Mapping<br /><ul><li>Attributi </li></ul>MaxLenght<br />Key<br />DataType<br />…<br /><ul><li>L’utilizzo degli attributi può rendere «difficile» la lettura del codice della definizione del nostro modello dati. </li></li></ul><li>Configuration & Mapping<br /><ul><li>Fluent Api</li></ul>Stesse funzionalità di mapping degli attributi<br />Necessarie per scenari di mapping più complessi (nel 99,99 % dei casi reali )<br />EntitySplitting (1 entità «spalmata» su N tabelle)<br />Gerarchie di Ereditarietà<br />Table per Class<br />Table per Class Hierarchy<br />Table per Concrete Class<br />TableSplitting (1 tabella «spalmata» su N entità)<br />Configurazione & mappingconcentrato in un solo punto:<br />OverrideOnModelCreatingdella classe DbContext<br />
  7. 7. Configuration & Mapping<br /><ul><li>Durante la fase di «mapping» possiamo utilizzare la collezione Configurations per:</li></ul>Aggiungere nuove configurazioni a quelle già presenti<br />Classi derivate da EntityTypeConfiguration<> o ComplexTypeConfiguration<> secondo dei casi<br />Rimuovere configurazioni esistenti<br /><ul><li>Possiamo utilizzare la collezione Conventions per rimuovere le convenzioni esistenti:</li></ul>modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()<br />PluggableConventions non supportate (in questa versione) <br /><ul><li>Per ogni istanza della classe derivata da DbContext, tramite la proprietà Configuration possiamo impostare (abilitate per default):</li></ul>AutoDetectChangesEnabled <br />LazyLoadingEnabled<br />ProxyCreationEnabled<br />ValidateOnSaveEnabled<br />
  8. 8. Configuration & Mapping<br />Inizializzazione del database<br />Cancella e crea in ogni caso<br />Database.SetInitializer<Db>(new DropCreateDatabaseAlways<Db>());<br />Crea se non esiste<br />Database.SetInitializer<Db>(new CreateDatabaseIfNotExists<Db>());<br />Cancella e crea se il modello cambia (Attenzione!)<br />Database.SetInitializer<Db>(new DropCreateDatabaseIfModelChanges<Db>());<br />Strategia Custom<br />Database.SetInitializer<Db>(new DbCustomDatabaseStrategy()); <br />DEMO<br />
  9. 9. Validazione<br />Perché ‘Validare ?’<br />Dati corretti <br />Risparmiare round trip sul server (SQL Azure)<br />In EF 4.1<br />Abilitata per default<br />Utilizza attributi (DataAnnotations.ValidationAttribute)<br />Validazione automatica dei ComplextType<br />Supporta l’interfaccia IValidatableObject<br />Attributi su NavigationProperties e Collection (validità della proprietà e non degli elementi)<br />
  10. 10. Validazione<br />Quando viene eseguita ?<br />Prima della persistenza dei dati<br />On-demand per singola entità<br />On-demand per singola proprietà<br />Se la validazione non ha successo:<br />DbEntityValidationException (EntityValidationErrors)<br />DbEntityValidationResult (ValidationErrors)<br />ValidationError<br /><ul><li>Perché non System.ComponentModel.DataAnnotations.Validator?</li></ul>Non esegue la validazione automatica dei ComplexType<br />DEMO<br />
  11. 11. Proprietà<br />Per ogni proprietà di un’entità:<br />Current Value (getset)<br />Context.Entry(entity).Property(n=>n.name).CurrentValue<br />Original Value (getset)<br />Context.Entry(entity).Property(n=>name).OriginalValue<br />Verificare proprietà modificate:<br />Context.Entry(entity).Property(n=>n.name).IsModified (GetSet)<br />Forzare l’Updatedurante il SaveChanges() anche se Original Value e Current Value coincidono<br />Current, Original e Database Values:<br />Context.Entry(entity).CurrentValues()<br />Context.Entry(entity).OriginalValues()<br />Context.Entry(entity).GetDatabaseValues()<br />
  12. 12. Proprietà<br />Original e CurrentValues da un altro oggetto:<br /> Consideriamo un DTO del tipo:<br />new Book {Title=‘Pippo’ , ISBN=‘Franco’};<br />Il DTO viene utilizzato da Services Layerper la comunicazione tra strati<br />Valorizzare la entity da modificare<br />Context.Entry(entity).CurrentValues.SetValues(dto)<br />DEMO<br />
  13. 13. Persistenza e Query<br />Abbiamo visto nella sessione di Alessandro l’utilizzo di LINQ per l’interrogazione dei dati. <br />
  14. 14. Persistenza e Query<br />Stored Procedure<br /><ul><li>Non c’è un supporto diretto al mapping di Stored Procedure come ad esempio in Model First.
  15. 15. Possiamo utilizzare l’ObjectContext «wrappato» dal DbContext corrente
  16. 16. Oppure
  17. 17. DbContext.Books.SqlQuery(con Tracking)
  18. 18. DbContext.Database.SqlQuery<Book> (No Tracking)
  19. 19. DbContext.Database.ExecuteSqlCommand("EXECUTE [dbo].[GetAllProducts]"); (No Tracking)</li></ul>DEMO<br />
  20. 20. Concorrenza<br />Concorrenza (ottimistica):<br />Specifichiamo le proprietà interessate <br />Attributo [ConcurrencyCheck]<br />Due possibili strategie:<br />StoreWins<br />Utilizziamo il metodo Reload() per sovrascrivere i dati dell’entity con quelli presenti nel database<br />Client Wins<br />Sostituiamo i valori originali dell’entity con quelli del database GetDatabaseValues() (eliminazione delle incogruenze)<br />DEMO<br />
  21. 21. Futuro (Entity Framework 4.2)<br />Rilasciata la CTP a Giugno 2011 e la Beta 1 ad Agosto 2011<br />Enum<br />SpatialType<br />Table-Valuedfunctions<br />Stored Procedure con result sets multipli<br />Ottimizzazione delle query nei modelli Table-per-Type (TPT)<br />Query Linq automaticamente compilate e «cached»<br />Entity Data Model con diagrammi multipli<br />Stored Procedure mappate automaticamente a ComplexType<br />Miglioramenti e aggiunge di funzionalità all’Entity Data Designer<br />Code First Sql Migration<br />Evoluzione del database in sincronia con l’evoluzione del modello Code First<br />
  22. 22. Link utili<br />Entity Framework 4.1 Download: http://www.microsoft.com/download/en/details.aspx?id=8363<br />Blog Personale: http://blogs.ugidotnet.org/PietroLibroBlog<br />Blog EntityFramework Design: http://blogs.msdn.com/b/efdesign<br />Ado.NetTeam Blog: http://blogs.msdn.com/b/adonet<br />DomusDotNet : http://www.domusdotnet.org<br />

×