SlideShare a Scribd company logo
Entity Framework 4.1 – Code FirstPietro Libro, Fondatore DomusDotNetpietro.libro@domusdotnet.orgRoma, 7 Ottobre 2011
AgendaConfiguration & MappingValidazioneProprietà, Persistenza e QueryConcorrenza
Configuration & MappingL’origine di tutto: la classe DbContextI 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 ModelSe ci basiamo solo sulle convezioni nient’altro.
Configuration & MappingQuali convezioni?Nome database e stringa di connessioneDi default: «Localhost\SQLEXPRESS», Full QualifiedTypeName del DbContextderivatoOverride: aggiungere App.Config o Web.Config con una stringa di connessione Custom il cui nome è uguale al DbContext derivato
Configuration & MappingQuali convezioni ? Per il mapping delle colonne abbiamo convezioni per:Chiave primarieNomi delle tabelleNomi delle colonneNomi delle relazioniForeignKeyTipiEcc…Possiamo cambiarle ? Ovviamente si:Utilizzando gli attributi del System.ComponentModel.AnnotationsFluent APIElenco delle convenzioni Code Firsthttp://msdn.microsoft.com/en-us/library/hh161541%28VS.103%29.aspx
Configuration & MappingAttributi MaxLenghtKeyDataType…L’utilizzo degli attributi può rendere «difficile» la lettura del codice della definizione del nostro modello dati. Configuration & MappingFluent ApiStesse funzionalità di mapping degli attributiNecessarie per scenari di mapping più complessi (nel 99,99 % dei casi reali )EntitySplitting (1 entità «spalmata» su N tabelle)Gerarchie di EreditarietàTable per ClassTable per Class HierarchyTable per Concrete ClassTableSplitting (1 tabella «spalmata» su N entità)Configurazione & mappingconcentrato in un solo punto:OverrideOnModelCreatingdella classe DbContext
Configuration & MappingDurante la fase di «mapping» possiamo utilizzare la collezione Configurations per:Aggiungere nuove configurazioni a quelle già presentiClassi derivate da EntityTypeConfiguration<>  o  ComplexTypeConfiguration<>  secondo dei casiRimuovere configurazioni esistentiPossiamo utilizzare la collezione Conventions  per rimuovere le convenzioni esistenti:modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()PluggableConventions non supportate (in questa versione) Per ogni istanza della classe derivata da DbContext, tramite la proprietà Configuration possiamo impostare (abilitate per default):AutoDetectChangesEnabled LazyLoadingEnabledProxyCreationEnabledValidateOnSaveEnabled
Configuration & MappingInizializzazione del databaseCancella e crea in ogni casoDatabase.SetInitializer<Db>(new DropCreateDatabaseAlways<Db>());Crea se non esisteDatabase.SetInitializer<Db>(new CreateDatabaseIfNotExists<Db>());Cancella e crea se il modello cambia (Attenzione!)Database.SetInitializer<Db>(new DropCreateDatabaseIfModelChanges<Db>());Strategia CustomDatabase.SetInitializer<Db>(new DbCustomDatabaseStrategy()); DEMO
ValidazionePerché ‘Validare ?’Dati corretti Risparmiare round trip sul server (SQL Azure)In EF 4.1Abilitata per defaultUtilizza attributi (DataAnnotations.ValidationAttribute)Validazione automatica dei ComplextTypeSupporta l’interfaccia IValidatableObjectAttributi su NavigationProperties e Collection (validità della proprietà e non degli elementi)
ValidazioneQuando viene eseguita ?Prima della  persistenza dei datiOn-demand per singola entitàOn-demand per singola proprietàSe la validazione non ha successo:DbEntityValidationException (EntityValidationErrors)DbEntityValidationResult (ValidationErrors)ValidationErrorPerché non System.ComponentModel.DataAnnotations.Validator?Non esegue la validazione automatica dei ComplexTypeDEMO
ProprietàPer ogni proprietà di  un’entità:Current Value (get\set)Context.Entry(entity).Property(n=>n.name).CurrentValueOriginal Value (get\set)Context.Entry(entity).Property(n=>name).OriginalValueVerificare proprietà modificate:Context.Entry(entity).Property(n=>n.name).IsModified (Get\Set)Forzare l’Updatedurante il SaveChanges() anche se Original Value e Current Value coincidonoCurrent, Original e Database Values:Context.Entry(entity).CurrentValues()Context.Entry(entity).OriginalValues()Context.Entry(entity).GetDatabaseValues()
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 stratiValorizzare la entity da modificareContext.Entry(entity).CurrentValues.SetValues(dto)DEMO
Persistenza e QueryAbbiamo visto nella sessione di Alessandro  l’utilizzo di LINQ per l’interrogazione dei dati.
Persistenza e QueryStored ProcedureNon 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)

More Related Content

Similar to Pomeriggio Entity Framework - Code First (20)

PPTX
EF 6.0 What's New - EF@Work
Pietro Libro
 
PPTX
Build a LINQ-enabled Repository
Andrea Saltarello
 
PPTX
Entity Framework 7, Back To The Future!
Michael Denny
 
PDF
iOS_Course_13
Dario Pizzuto
 
PPTX
Design Patterns - enterprise patterns (part I)
Fabio Armani
 
PPT
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
Alessandro Del Sole
 
PDF
Approccio Pratico al Domain Driven Design
Luca Milan
 
PDF
How I did it (in .NET): idiomatic Domain Driven Design
Andrea Saltarello
 
PDF
EE Incremental Store
firenze-gtug
 
PDF
Design Patterns - Enterprise Patterns (part 2)
Fabio Armani
 
PDF
Code Contracts and Generics: implementing a LINQ-enabled Repository
Andrea Saltarello
 
PDF
TesiEtta
Gabriele Etta
 
PDF
Layered Expression Trees feat. CQRS
Andrea Saltarello
 
PDF
Never Mind the Bollocks: here's the Domain Driven Design
Andrea Saltarello
 
PDF
Domain Driven Design e CQRS
Manuel Scapolan
 
KEY
Ddd brutto sporco e cattivo
Alberto Brandolini
 
PDF
ASP.NET
Manuel Scapolan
 
PDF
Repository pattern slides v1.1
Christian Nastasi
 
PPTX
Introduzione al Domain Driven Design (DDD)
DotNetMarche
 
PDF
Architetttura Della Soluzione
Luca Milan
 
EF 6.0 What's New - EF@Work
Pietro Libro
 
Build a LINQ-enabled Repository
Andrea Saltarello
 
Entity Framework 7, Back To The Future!
Michael Denny
 
iOS_Course_13
Dario Pizzuto
 
Design Patterns - enterprise patterns (part I)
Fabio Armani
 
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
Alessandro Del Sole
 
Approccio Pratico al Domain Driven Design
Luca Milan
 
How I did it (in .NET): idiomatic Domain Driven Design
Andrea Saltarello
 
EE Incremental Store
firenze-gtug
 
Design Patterns - Enterprise Patterns (part 2)
Fabio Armani
 
Code Contracts and Generics: implementing a LINQ-enabled Repository
Andrea Saltarello
 
TesiEtta
Gabriele Etta
 
Layered Expression Trees feat. CQRS
Andrea Saltarello
 
Never Mind the Bollocks: here's the Domain Driven Design
Andrea Saltarello
 
Domain Driven Design e CQRS
Manuel Scapolan
 
Ddd brutto sporco e cattivo
Alberto Brandolini
 
Repository pattern slides v1.1
Christian Nastasi
 
Introduzione al Domain Driven Design (DDD)
DotNetMarche
 
Architetttura Della Soluzione
Luca Milan
 

More from DomusDotNet (17)

PPTX
Application lifecycle management ... e quindi
DomusDotNet
 
PPTX
Unit testing in Visual Studio 2013
DomusDotNet
 
PPTX
ASP.NET MVC: sfruttare la piattaforma al 100%
DomusDotNet
 
PPTX
Push Notification, Live Tile e Background Agent
DomusDotNet
 
PDF
Sviluppare per Intel® Ultrabook™
DomusDotNet
 
PPTX
ALM@Work - Team collaboration with visual studio alm 2012
DomusDotNet
 
PPTX
ALM@Work - Lab management for everyone
DomusDotNet
 
PPTX
ALM@Work - Continuous delivery 101
DomusDotNet
 
PPTX
ALM@Work - Unit testing in Visual studio 2012
DomusDotNet
 
PPTX
ALM@Work - Typical developer day
DomusDotNet
 
PPTX
We Want Web - Web Applications con MVC 3
DomusDotNet
 
PPTX
WeWantWeb - WCF Data Services
DomusDotNet
 
PPTX
ALM Revolutions - Non si vive di solo check-out e check-in
DomusDotNet
 
PPTX
ALM Revolutions - Process Template Customization
DomusDotNet
 
PPTX
ALM Revolutions - What's new in visual studio ALM 11
DomusDotNet
 
PDF
Pomeriggio Entity Framework - WP7 e SQL Compact Edition
DomusDotNet
 
PPTX
Pomeriggio Entity Framework - Database First
DomusDotNet
 
Application lifecycle management ... e quindi
DomusDotNet
 
Unit testing in Visual Studio 2013
DomusDotNet
 
ASP.NET MVC: sfruttare la piattaforma al 100%
DomusDotNet
 
Push Notification, Live Tile e Background Agent
DomusDotNet
 
Sviluppare per Intel® Ultrabook™
DomusDotNet
 
ALM@Work - Team collaboration with visual studio alm 2012
DomusDotNet
 
ALM@Work - Lab management for everyone
DomusDotNet
 
ALM@Work - Continuous delivery 101
DomusDotNet
 
ALM@Work - Unit testing in Visual studio 2012
DomusDotNet
 
ALM@Work - Typical developer day
DomusDotNet
 
We Want Web - Web Applications con MVC 3
DomusDotNet
 
WeWantWeb - WCF Data Services
DomusDotNet
 
ALM Revolutions - Non si vive di solo check-out e check-in
DomusDotNet
 
ALM Revolutions - Process Template Customization
DomusDotNet
 
ALM Revolutions - What's new in visual studio ALM 11
DomusDotNet
 
Pomeriggio Entity Framework - WP7 e SQL Compact Edition
DomusDotNet
 
Pomeriggio Entity Framework - Database First
DomusDotNet
 
Ad

Pomeriggio Entity Framework - Code First

  • 1. Entity Framework 4.1 – Code FirstPietro Libro, Fondatore [email protected], 7 Ottobre 2011
  • 3. Configuration & MappingL’origine di tutto: la classe DbContextI 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 ModelSe ci basiamo solo sulle convezioni nient’altro.
  • 4. Configuration & MappingQuali convezioni?Nome database e stringa di connessioneDi default: «Localhost\SQLEXPRESS», Full QualifiedTypeName del DbContextderivatoOverride: aggiungere App.Config o Web.Config con una stringa di connessione Custom il cui nome è uguale al DbContext derivato
  • 5. Configuration & MappingQuali convezioni ? Per il mapping delle colonne abbiamo convezioni per:Chiave primarieNomi delle tabelleNomi delle colonneNomi delle relazioniForeignKeyTipiEcc…Possiamo cambiarle ? Ovviamente si:Utilizzando gli attributi del System.ComponentModel.AnnotationsFluent APIElenco delle convenzioni Code Firsthttp://msdn.microsoft.com/en-us/library/hh161541%28VS.103%29.aspx
  • 6. Configuration & MappingAttributi MaxLenghtKeyDataType…L’utilizzo degli attributi può rendere «difficile» la lettura del codice della definizione del nostro modello dati. Configuration & MappingFluent ApiStesse funzionalità di mapping degli attributiNecessarie per scenari di mapping più complessi (nel 99,99 % dei casi reali )EntitySplitting (1 entità «spalmata» su N tabelle)Gerarchie di EreditarietàTable per ClassTable per Class HierarchyTable per Concrete ClassTableSplitting (1 tabella «spalmata» su N entità)Configurazione & mappingconcentrato in un solo punto:OverrideOnModelCreatingdella classe DbContext
  • 7. Configuration & MappingDurante la fase di «mapping» possiamo utilizzare la collezione Configurations per:Aggiungere nuove configurazioni a quelle già presentiClassi derivate da EntityTypeConfiguration<> o ComplexTypeConfiguration<> secondo dei casiRimuovere configurazioni esistentiPossiamo utilizzare la collezione Conventions per rimuovere le convenzioni esistenti:modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()PluggableConventions non supportate (in questa versione) Per ogni istanza della classe derivata da DbContext, tramite la proprietà Configuration possiamo impostare (abilitate per default):AutoDetectChangesEnabled LazyLoadingEnabledProxyCreationEnabledValidateOnSaveEnabled
  • 8. Configuration & MappingInizializzazione del databaseCancella e crea in ogni casoDatabase.SetInitializer<Db>(new DropCreateDatabaseAlways<Db>());Crea se non esisteDatabase.SetInitializer<Db>(new CreateDatabaseIfNotExists<Db>());Cancella e crea se il modello cambia (Attenzione!)Database.SetInitializer<Db>(new DropCreateDatabaseIfModelChanges<Db>());Strategia CustomDatabase.SetInitializer<Db>(new DbCustomDatabaseStrategy()); DEMO
  • 9. ValidazionePerché ‘Validare ?’Dati corretti Risparmiare round trip sul server (SQL Azure)In EF 4.1Abilitata per defaultUtilizza attributi (DataAnnotations.ValidationAttribute)Validazione automatica dei ComplextTypeSupporta l’interfaccia IValidatableObjectAttributi su NavigationProperties e Collection (validità della proprietà e non degli elementi)
  • 10. ValidazioneQuando viene eseguita ?Prima della persistenza dei datiOn-demand per singola entitàOn-demand per singola proprietàSe la validazione non ha successo:DbEntityValidationException (EntityValidationErrors)DbEntityValidationResult (ValidationErrors)ValidationErrorPerché non System.ComponentModel.DataAnnotations.Validator?Non esegue la validazione automatica dei ComplexTypeDEMO
  • 11. ProprietàPer ogni proprietà di un’entità:Current Value (get\set)Context.Entry(entity).Property(n=>n.name).CurrentValueOriginal Value (get\set)Context.Entry(entity).Property(n=>name).OriginalValueVerificare proprietà modificate:Context.Entry(entity).Property(n=>n.name).IsModified (Get\Set)Forzare l’Updatedurante il SaveChanges() anche se Original Value e Current Value coincidonoCurrent, 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 stratiValorizzare la entity da modificareContext.Entry(entity).CurrentValues.SetValues(dto)DEMO
  • 13. Persistenza e QueryAbbiamo visto nella sessione di Alessandro l’utilizzo di LINQ per l’interrogazione dei dati.
  • 14. Persistenza e QueryStored ProcedureNon c’è un supporto diretto al mapping di Stored Procedure come ad esempio in Model First.
  • 15. Possiamo utilizzare l’ObjectContext «wrappato» dal DbContext corrente
  • 20. ConcorrenzaConcorrenza (ottimistica):Specifichiamo le proprietà interessate Attributo [ConcurrencyCheck]Due possibili strategie:StoreWinsUtilizziamo il metodo Reload() per sovrascrivere i dati dell’entity con quelli presenti nel databaseClient WinsSostituiamo 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 2011EnumSpatialTypeTable-ValuedfunctionsStored Procedure con result sets multipliOttimizzazione delle query nei modelli Table-per-Type (TPT)Query Linq automaticamente compilate e «cached»Entity Data Model con diagrammi multipliStored Procedure mappate automaticamente a ComplexTypeMiglioramenti e aggiunge di funzionalità all’Entity Data DesignerCode First Sql MigrationEvoluzione del database in sincronia con l’evoluzione del modello Code First
  • 22. Link utiliEntity Framework 4.1 Download: http://www.microsoft.com/download/en/details.aspx?id=8363Blog Personale: http://blogs.ugidotnet.org/PietroLibroBlogBlog EntityFramework Design: http://blogs.msdn.com/b/efdesignAdo.NetTeam Blog: http://blogs.msdn.com/b/adonetDomusDotNet : http://www.domusdotnet.org