Modello Generatore di entità con rilevamento automatico ADO.NET
In questo argomento viene fornita una panoramica sul modello Generatore di entità con rilevamento automatico ADO.NET incluso in Visual Studio 2010. Nell'argomento viene inoltre illustrato come personalizzare il modello di testo. Il modello Generatore di entità con rilevamento automatico ADO.NET genera il codice del livello oggetti costituito dall'oggetto ObjectContext tipizzato e dalle classi di entità contenenti la logica dello stato con rilevamento automatico. È possibile utilizzare le entità con rilevamento automatico quando si utilizzano le applicazioni a più livelli. Per ulteriori informazioni, vedere Working with Self-Tracking Entities e Walkthrough: Serialize Self-Tracking Entities.
Il modello Generatore di entità con rilevamento automatico ADO.NET è costituito da due file modello di testo: <nome modello>.tt e <nome modello>.Context.tt. Il modello <nome modello>.Context.tt genera l'oggetto ObjectContext tipizzato. Il modello <nome modello>.tt genera i tipi di entità con rilevamento automatico.
Entrambi modelli di testo iniziano con direttive incorporate che indicano al motore di elaborazione dei modelli come elaborare il modello. I modelli di testo includono il file con estensione ttinclude. Il file con estensione ttinclude contiene classi di utilità che supportano i modelli ADO.NET nel processo di generazione di codice. Per ulteriori informazioni sul file con estensione ttinclude, vedere File con estensione ttinclude dell'utilità Entity Framework.
<#@ template language="VB" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.VB.ttinclude"#>
<#@ output extension=".vb"#>
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ output extension=".cs"#>
Il codice quindi crea un'istanza delle classi di supporto definite nel file con estensione ttinclude e le inizializza.
Dim code As New CodeGenerationTools(Me)
Dim ef As New MetadataTools(Me)
Dim loader As New MetadataLoader(Me)
Dim region As New CodeRegion(Me)
Dim fileManager As EntityFrameworkTemplateFileManager = EntityFrameworkTemplateFileManager.Create(Me)
CodeGenerationTools code = new CodeGenerationTools(this);
MetadataTools ef = new MetadataTools(this);
MetadataLoader loader = new MetadataLoader(this);
CodeRegion region = new CodeRegion(this);
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
Il codice inizializza inoltre la stringa inputFile. Se si spostano i modelli dal progetto contenente il file con estensione edmx in un altro progetto, è necessario modificare la stringa inputFile nel relativo percorso del file con estensione edmx.
Dim inputFile As String = "SchoolModel.edmx"
string inputFile = @"SchoolModel.edmx";
Nelle due sezioni seguenti viene illustrato nello specifico quello che viene generato da ogni file con estensione tt.
<nome modello>.Context.tt
Il modello <nome modello>.Context.tt genera due file di origine. I file di origine vengono visualizzati sotto il file <nome modello>.Context.tt in Esplora soluzioni.
Un file con nome <nome modello>.Context.cs (o vb). Il codice sorgente generato contiene la definizione della classe ObjectContext tipizzata. La definizione include:
Overload del costruttore. I costruttori hanno impostato la creazione di proxy su false e registrano l'oggetto ObjectMaterializedEventHandler. Per informazioni su gli oggetti POCO (Plain Old CLR Objects) e sugli oggetti proxy, vedere Working with POCO Entities.
Proprietà di ObjectSet.
Metodi di importazione delle funzioni (se ne sono stati definiti nel modello concettuale).
Un file con nome <nome modello>.Context.Extensions.cs (o vb). Il file di origine generato contiene due metodi di estensione ApplyChanges (uno per ObjectContext e l'altro per ObjectSet) e metodi privati che supportano il metodo ApplyChanges. Il metodo ApplyChanges esamina le informazioni sul rilevamento delle modifiche contenute nel grafico di entità con rilevamento automatico e deduce il set di operazioni che è necessario eseguire per salvare le modifiche nel database.
<nome modello>.tt
Il modello <nome modello>.tt genera più file di origine. I file di origine vengono visualizzati sotto il file <nome modello>.tt in Esplora soluzioni.
Un file denominato <nome modello>.cs (o .vb) che contiene gli elementi seguenti:
La definizione della classe helper ObjectChangeTracker. Un'istanza ObjectChangeTracker contiene e rileva informazioni su tutte le modifiche apportate a tipi che implementano IObjectWithChangeTracker. ObjectChangeTracker è parte del contratto dati degli oggetti con rilevamento automatico e viene pertanto serializzato insieme a tali dati.
La definizione dell'interfaccia di IObjectWithChangeTracker. L'interfaccia viene implementata dalle entità con rilevamento automatico e contiene un'unica proprietà di sola lettura per il recupero dell'oggetto ObjectChangeTracker per un'entità.
Metodi di estensione definiti per i tipi IObjectWithChangeTracker che consentono di modificare lo stato delle entità tramite ObjectChangeTracker. Di seguito viene riportato l'elenco dei metodi di estensione: MarkAs[State], StartTracking, StopTracking e AcceptChanges. Per informazioni sulle funzioni dei singoli metodi di estensione, vedere Working with Self-Tracking Entities.
La definizione dell'oggetto TrackableCollection di T che deriva da ObservableCollection. Ogni entità dotata di proprietà di navigazione della raccolta registra un gestore per l'evento CollectionChanged sull'oggetto TrackableCollection di T per la proprietà di navigazione specifica. Il gestore esegue il rilevamento delle modifiche e la logica che sincronizza entrambe le entità finali della relazione.
La definizione dell'interfaccia di INotifyComplexPropertyChanging. L'interfaccia fornisce un evento che si verifica quando cambiano le proprietà complesse. La modifica può essere un'assegnazione di una nuova istanza di tipo complesso a una proprietà complessa oppure la modifica di una proprietà scalare in un'istanza di tipo complesso.
La definizione dell'enumerazione di ObjectState. L'elenco di enumeratori ObjectState è costituito dalle costanti seguenti: Unchanged, Added, Modified e Deleted.
Esistono altri tipi nel file che vengono utilizzati per archiviare informazioni sullo stato all'interno di ObjectChangeTracker. Per ulteriori informazioni, visualizzare il file <nome modello>.cs o <nome modello>.vb.
Un file per ogni tipo di entità e tipo complesso definito nel modello concettuale: <nome tipo complesso o entità>.cs (vb).
I tipi di entità sono classi parziali che implementano IObjectWithChangeTracker e INotifyPropertyChanged per supportare l'associazione dati bidirezionale in Windows Form, WPF e Silverlight.
L'attributo DataContract viene aggiunto all'inizio della classe per consentirne la serializzazione. Viene inoltre specificato
IsReference = true
nell'attributo DataContract. Ciò significa che la serializzazione per questo tipo è una serializzazione profonda.All'inizio della classe vengono aggiunti gli attributi KnownType. Esiste un solo attributo KnownType per ogni tipo per cui questo tipo di entità presenta una proprietà di navigazione.
La definizione delle classi dell'identità include: proprietà primitive, proprietà complesse, proprietà di navigazione, la proprietà ChangeTracker e metodi di supporto della logica di sincronizzazione delle relazioni.
I tipi complessi sono classi parziali che implementano INotifyComplexPropertyChanging e INotifyPropertyChanged.
Personalizzazione del codice del livello oggetti
Per personalizzare il modo in cui viene generato il codice del livello oggetti, è necessario modificare il file con estensione tt. È necessario modificare il nome del contesto dell'oggetto tipizzato, aggiungere proprietà o attributi nuovi o modificare quelli esistenti sui tipi di entità oppure fare in modo che il tipo di entità erediti da un'interfaccia.
Per personalizzare il codice del livello oggetti, è necessario modificare il blocchi di testo nel file con estensione tt. Il blocco di testo viene definito esternamente ai tag <# e #>. Per modificare il nome del contesto dell'oggetto tipizzato, aprire il file <nome modello>.Context.tt e aggiungere il termine (ad esempio, My
) prima di tutte le occorrenze di <#=code.Escape(container)#>
. Quindi, se nel file con estensione edmx il nome del contenitore è SchoolEntities
, nel codice generato il nome del contenitore sarà MySchoolEntities.
Per ulteriori informazioni, vedere Procedura: personalizzare la generazione di codice del livello oggetti (Entity Data Model Designer).
Vedere anche
Concetti
File con estensione ttinclude dell'utilità Entity Framework
Altre risorse
Working with Self-Tracking Entities
Walkthrough: Serialize Self-Tracking Entities