Condividi tramite


Pianificare per Entity Framework Core 7.0

Come descritto nel processo di pianificazione, abbiamo raccolto l'input degli stakeholder in un piano per Entity Framework Core 7.0 (EF Core 7.0). Per brevità, EF Core 7.0 viene anche definito semplicemente EF7.

Importante

Questo piano non è un impegno; si evolverà man mano che continueremo a imparare in tutta la versione. Alcune cose attualmente non pianificate per EF7 potrebbero essere estratte. Alcune cose attualmente pianificate per EF7 potrebbero essere puntate.

Informazioni generali

EF Core 7.0 è la versione successiva dopo EF Core 6.0 ed è attualmente pianificata per il rilascio a novembre 2022 contemporaneamente a .NET 7. Non sono previsti piani per una versione di EF Core 6.1.

Piattaforme supportate

EF7 è attualmente destinato a .NET 6. Questo può essere aggiornato a .NET 7 man mano che si avvicina la versione. EF7 non ha come destinazione alcuna versione di .NET Standard; per altre informazioni, vedere il futuro di .NET Standard. EF7 non verrà eseguito in .NET Framework.

EF7 sarà allineato ai criteri di supporto di .NET e non sarà quindi una versione LTS (Long-Term Support).

Modifiche di rilievo

EF7 conterrà un numero ridotto di modifiche di rilievo man mano che si continua a evolvere sia EF Core che la piattaforma .NET. L'obiettivo è ridurre al minimo le modifiche di rilievo il più possibile.

Temi

I grandi investimenti in EF7 rientrano principalmente nei temi seguenti:

  • Funzionalità altamente richieste
  • Piattaforme e ecosistema NET
  • Cancellare il percorso da EF6
  • Prestazioni

Ognuno di questi temi è descritto in dettaglio di seguito. Lo stato generale di ogni tema può essere rilevato negli aggiornamenti biweekly di EF Core. Commentare il problema #26994 di GitHub con eventuali commenti o suggerimenti.

Tema: funzionalità altamente richieste

Come sempre, un input importante nel processo di pianificazione proviene dai voti (👍) per le funzionalità in GitHub. In base a questi voti oltre ad altri fattori, si prevede di lavorare sulle seguenti funzionalità altamente richieste per EF7.

Colonne JSON

Rilevato dal problema 4021: Eseguire il mapping dei valori JSON archiviati nel database alle proprietà di Entity Framework

Proposta di valore: salvare ed eseguire query in documenti basati su JSON archiviati in colonne di database relazionali.

Questa funzionalità introduce un meccanismo e modelli comuni per il supporto JSON che può essere implementato da qualsiasi provider di database. Microsoft collaborerà con la community per allineare le implementazioni esistenti per Npgsql e Pomelo MySQL e aggiungere anche il supporto per SQL Server e SQLite.

Aggiornamenti in blocco

Rilevato dal problema 795: operazioni CUD bulk (ad esempio, basate su set) (senza caricare dati in memoria)

Proposta di valore: aggiornamenti efficienti basati su predicato per molte righe di database senza caricare i dati in memoria.

Il rilevamento delle modifiche seguito da SaveChanges è il meccanismo principale di EF Core per l'inserimento, l'aggiornamento e l'eliminazione di entità. Questo meccanismo garantisce che le operazioni di database vengano ordinate per soddisfare i vincoli e che le entità rilevate vengano mantenute sincronizzate con le modifiche apportate al database. Tuttavia, richiede un round trip del database per caricare le entità in memoria per creare i comandi di database appropriati, seguito da un round trip del database per eseguire questi comandi.

Al contrario, gli aggiornamenti in blocco o basati su set comportano la definizione delle modifiche che devono essere apportate al database e quindi l'esecuzione di tali modifiche senza prima caricare le entità in memoria. Questo può essere notevolmente più veloce rispetto agli aggiornamenti rilevati, soprattutto quando è necessario applicare la stessa modifica a molte entità/righe diverse.

Per EF7, si prevede di implementare aggiornamenti ed eliminazioni in blocco (ma non di inserimenti). Si noti che gli aggiornamenti in blocco non corrispondono all'invio in batch degli aggiornamenti. EF Core combina già le modifiche a molte entità rilevate in batch durante l'invio di aggiornamenti al database tramite SaveChanges.

Hook del ciclo di vita

Rilevato dal problema 626: Hook del ciclo di vita

Proposta di valore: consente alle applicazioni di reagire quando si verificano aspetti interessanti nel codice di Entity Framework.

Gli hook del ciclo di vita consentono la notifica di un'applicazione o di una libreria ogni volta che si verificano determinate condizioni o azioni interessanti per entità, proprietà, relazioni, query, istanze di contesto e altri costrutti di Entity Framework. Sono stati implementati molti hook del ciclo di vita rispetto alle versioni precedenti di EF Core, inclusi vari intercettori ed eventi. Per EF7, si prevede di aggiungere hook mancanti importanti. Ad esempio, un hook per la manipolazione delle istanze di entità dopo la creazione, comunemente noto come ObjectMaterialized.

Mapping TPC (Table-per-concrete-type)

Rilevato dal problema n. 3170: modello di mapping dell'ereditarietà TPC

Proposta di valore: eseguire il mapping delle entità in una gerarchia a tabelle separate senza ottenere il riscontro delle prestazioni del mapping TPT.

EF Core supporta il mapping TPT (Table-Per-Hierarchy) e table-per-type (TPT) per le gerarchie di ereditarietà .NET. Il mapping di tipo TPC (Table Per Concrete Type) è simile al mapping TPT in quanto ogni tipo di entità nella gerarchia viene mappato a una tabella di database diversa. Tuttavia, mentre TPT esegue il mapping delle proprietà da un tipo di base alle colonne in una tabella per il tipo di base, TPC esegue il mapping delle proprietà del tipo di base alla stessa tabella del tipo concreto effettivo di cui viene eseguito il mapping. Ciò può comportare prestazioni notevolmente più veloci perché non è necessario unire più tabelle durante l'esecuzione di query per un tipo specifico. Ciò comporta la denormalizzazione dei dati, poiché le colonne vengono duplicate nelle tabelle mappate a ogni tipo concreto nella gerarchia.

Il lavoro per il mapping TPC include anche la suddivisione di entità più generale e il supporto per specificare facet diversi per tabella in TPT, TPC o suddivisione di entità.

Eseguire il mapping delle operazioni CUD alle stored procedure

Rilevato dal problema n. 245: eseguire il mapping di inserimenti, aggiornamenti ed eliminazioni (operazioni CUD) alle stored procedure

Proposta di valore: usare stored procedure per gestire le modifiche ai dati.

EF Core supporta già l'esecuzione di query sui dati dalle stored procedure. Questa funzionalità consentirà di eseguire il mapping di inserimenti, aggiornamenti ed eliminazioni generati da SaveChanges a stored procedure nel database.

Oggetti Valore

Rilevato dal problema n. 9906: Usare struct o classi C# come oggetti valore

Proposta di valore: le applicazioni possono usare oggetti valore di tipo DDD nei modelli EF.

In precedenza era la visualizzazione team che le entità di proprietà, destinate al supporto aggregato, sarebbero anche un'approssimazione ragionevole per gli oggetti valore. L'esperienza ha dimostrato che questo non è il caso. Pertanto, in EF7, si prevede di introdurre un'esperienza migliore incentrata sulle esigenze degli oggetti valore nella progettazione basata su dominio. Questo approccio si baserà sui convertitori di valori anziché sulle entità di proprietà.

Questo lavoro è inizialmente limitato per consentire convertitori di valori che eseguono il mapping a più colonne. È possibile eseguire il pull di supporto aggiuntivo in base al feedback durante il rilascio.

Supportare la generazione di valori quando si usano convertitori di valori

Rilevato dal problema n. 11597: supportare più tipi di generazione di valori con convertitori

Proposta di valore: i tipi di chiave incapsulati in stile DDD possono usare completamente i valori di chiave generati automaticamente.

EF Core 6.0 ha consentito l'uso di più tipi di generazione di valori con chiavi mappate tramite convertitori di valori. Si prevede di generalizzare ed espandere questo supporto in EF7.

Query SQL non elaborate per tipi non mappati

Rilevato dal problema 10753: Supportare query SQL non elaborate senza definire un tipo di entità per il risultato

Proposta di valore: le applicazioni possono eseguire più tipi di query SQL non elaborate senza eliminare ADO.NET o usare librerie di terze parti.

Le query SQL non elaborate devono attualmente restituire un tipo nel modello, con o senza una chiave definita. In EF7 si prevede di consentire query SQL non elaborate che restituiscono direttamente tipi non contenuti nel modello di Entity Framework.

Il lavoro qui illustra anche le query SQL non elaborate che restituiscono tipi semplici/scalari, ad esempio Guid, DateTime, inte string.

Modelli di scaffolding del database

Rilevato dal problema 4038: Modelli di codice per lo scaffolding dei tipi di entità e DbContext da un database esistente

Proposta di valore: il codice generato da dotnet ef database scaffold può essere completamente personalizzato.

Spesso si ricevono richieste per modificare il codice generato durante lo scaffolding (reverse engineering) da un database esistente. Si prevede di risolvere queste richieste in EF7 supportando i modelli T4 per i tipi di entità generati e DbContext. Gli sviluppatori potranno personalizzare i modelli standard o creare nuovi modelli da zero.

Tema: piattaforme .NET ed ecosistema

Gran parte del lavoro pianificato per EF7 implica il miglioramento dell'esperienza di accesso ai dati per .NET in piattaforme e domini diversi. Ciò implica il lavoro in EF Core, se necessario, ma anche in altre aree per garantire un'esperienza ottimale nelle tecnologie .NET. Ci concentreremo sulle piattaforme/tecnologie seguenti per la versione di EF7:

Questo elenco si basa su molti fattori, tra cui i dati dei clienti, la direzione strategica e le risorse disponibili. Le aree generali su cui lavoreremo per queste piattaforme sono descritte di seguito.

Transazioni distribuite

Rilevato dal problema 715 in dotnet/runtime: Implementare transazioni distribuite/alzate di livello in System.Transactions

Proposta di valore: le applicazioni .NET Framework che usano transazioni distribuite possono essere convertite in .NET 7.

La System.Transactions libreria in .NET Framework contiene codice nativo che usa Windows Distributed Transactions Coordinator (DTC) per supportare le transazioni distribuite. Questo codice non è mai stato convertito in .NET Core. Nell'intervallo di tempo di .NET 7 si prevede di analizzare e avviare il processo di conversione di questa funzionalità in .NET moderno. Questa operazione verrà inizialmente solo per Windows e supporterà solo gli scenari di database in cui il provider ADO.NET supporta anche le transazioni distribuite. Altri usi di transazioni distribuite, ad esempio in WCF, non saranno supportati in .NET 7. In base al feedback e ai costi, è possibile implementare il supporto per altri scenari e/o piattaforme non Windows in una versione futura.

Strumenti di EF Core

Rilevato dal problema n. 26798: Modernizzare gli strumenti di EF Core

Proposta di valore: dotnet ef i comandi sono facili da usare e usare con piattaforme e tecnologie moderne.

Le piattaforme .NET si sono sviluppate sin dalla prima introduzione degli strumenti per le migrazioni, lo scaffolding del database e così via in EF Core 1.0. In EF7 si prevede di aggiornare l'architettura degli strumenti per supportare meglio le nuove piattaforme, ad esempio .NET MAUI, e semplificare il processo in aree come l'uso di più progetti. Ciò include un feedback migliore quando si verificano problemi, una migliore integrazione con registrazione, prestazioni e nuovo zucchero.

EF Core e interfacce utente grafiche

Rilevato dal problema n. 26799: Migliorare l'esperienza per il data binding e le interfacce grafiche

Proposta di valore: è facile creare applicazioni grafiche associate a dati con EF Core.

EF Core è progettato per funzionare bene con gli scenari di data binding, ad esempio quelli in Windows Form e .NET MAUI. Tuttavia, la connessione dei punti tra queste tecnologie non è sempre facile. Per EF7, si prevede di migliorare l'esperienza con EF Core e in Visual Studio per semplificare la compilazione di applicazioni associate a dati con EF Core.

SqlServer.Core (Woodstar)

Rilevato nel repository .NET Data Lab

Proposta di valore: accesso rapido e completamente gestito a SQL Server e Azure SQL per applicazioni .NET moderne.

Microsoft.Data.SqlClient è un provider di database ADO.NET completo per SQL Server. Supporta un'ampia gamma di funzionalità di SQL Server sia in .NET Core che in .NET Framework. Tuttavia, è anche una codebase grande e vecchia con molte interazioni complesse tra i relativi comportamenti. In questo modo è difficile analizzare i potenziali vantaggi che potrebbero essere ottenuti usando le funzionalità più recenti di .NET Core.

È stato avviato un progetto l'anno scorso, noto colloquialmente come "Woodstar", per analizzare il potenziale di un driver SQL Server a prestazioni elevata per .NET. Si prevede di effettuare ulteriori investimenti in questo progetto nell'intervallo di tempo di EF7.

Importante

L'investimento in Microsoft.Data.SqlClient non cambia. Continuerà a essere il modo consigliato per connettersi a SQL Server e Azure SQL, sia con che senza EF Core. Continuerà a supportare le nuove funzionalità di SQL Server man mano che vengono introdotte.

Provider Azure Cosmos DB

Rilevati da problemi etichettati con "area-cosmos" e nell'attività cardine 7.0

Proposta di valore: continuare a rendere EF Core il modo più semplice e produttivo per lavorare con Azure Cosmos DB.

Sono stati apportati miglioramenti significativi al provider di database Azure Cosmos DB di EF Core per la versione 6.0. Questi miglioramenti hanno creato un'esperienza di prima classe per l'uso di Azure Cosmos DB da EF Core, che si riflette nella crescita significativa nell'adozione. Si prevede di continuare questo slancio in EF7 con i miglioramenti del provider Azure Cosmos DB seguenti:

Assicurarsi di votare (👍) per le funzionalità del provider Azure Cosmos DB necessarie per poter valutare dove investire per ottenere il massimo vantaggio.

Esperienza delle migrazioni

Rilevato dal problema n. 22946: Miglioramenti alle migrazioni del database

Proposta di valore: è facile iniziare a usare le migrazioni e usarle in modo efficace nelle pipeline CI/CD.

EF Core 6.0 ha introdotto bundle di migrazioni, migliorando significativamente l'esperienza per le applicazioni native del cloud e la distribuzione di database all'interno di sistemi di integrazione e distribuzione continui. In EF7 si prevede di apportare miglioramenti aggiuntivi in questo settore in base al feedback dei clienti. Si prevede, ad esempio, di supportare l'esecuzione di tutte le migrazioni in una singola transazione per facilitare il ripristino in caso di errore.

Inoltre, si prevede di migliorare l'esperienza per gli sviluppatori che iniziano a usare le migrazioni. Ciò include la possibilità di creare automaticamente il database durante l'apprendimento o l'inizio di un progetto e quindi passare facilmente alle migrazioni gestite man mano che il progetto matura. In alternativa, per i progetti con un database esistente, si prevede di creare facilmente un modello ef iniziale e quindi passare alla gestione del database usando le migrazioni in futuro.

.NET moderno

Man mano che .NET continua a evolversi, si vuole garantire che l'accesso ai dati continui a essere un'esperienza ottimale. Per facilitare questa operazione, si prevede di compiere progressi su tre aree durante l'intervallo di tempo di EF7.

Taglio

Rilevato dal problema 21894: Migliorare il supporto di taglio per le app EF Core per ridurre le dimensioni dell'applicazione

Proposta di valore: applicazioni più piccole che possono essere compilate in modo efficiente AOT.

EF Core esegue grandi quantità di generazione di codice di runtime. Questa operazione è complessa per i modelli di app che dipendono dallo scuotimento dell'albero del linker, ad esempio Xamarin e Blazor, e dalle piattaforme che non consentono la compilazione dinamica, ad esempio iOS. Si prevede di migliorare notevolmente il taglio del codice inutilizzato in EF7. Ciò consentirà di semplificare le dimensioni degli assembly più piccole quando si usa EF Core, consentendo così la distribuzione e rendendo più efficiente la compilazione in anticipo (AOT).

Evolvere System.Linq.Expression

Proposta di valore: usare le funzionalità moderne del linguaggio C# nelle query LINQ.

Stiamo lavorando con il team roslyn in un piano per consentire l'uso di più funzionalità C# nelle espressioni LINQ. Questo è il lavoro in corso che verrà monitorato principalmente all'esterno del repository EF Core.

Tradurre nuovi operatori LINQ

Rilevato dal problema n. 25570: supportare le nuove funzionalità LINQ .NET

Proposta di valore: usare nuovi operatori LINQ durante la conversione di query LINQ in SQL.

I nuovi operatori LINQ sono stati aggiunti di recente all'elenco di controllo di accesso alla riga di controllo di accesso e si prevede che ne vengano aggiunti altri in futuro. Problema 25570 tiene traccia dell'aggiunta del supporto per questi elementi al provider LINQ EF7. Questo problema verrà aggiornato man mano che vengono aggiunti nuovi operatori LINQ. Come per tutti gli operatori LINQ esistenti, si aggiungerà il supporto solo quando l'operatore dispone di una traduzione ragionevole e utile nel database.

Aprire i dati di telemetria per i provider di ADO.NET

Rilevato dal problema n. 22336: Standardizzare in DiagnosticSource/OpenTelemetry per la traccia del database

Proposta di valore: dati di telemetria multipiattaforma e standard del settore che possono essere monitorati nello strumento preferito.

La telemetria aperta è un'iniziativa di Cloud Native Foundation per promuovere un meccanismo di telemetria comune per il software nativo del cloud. Per quanto riguarda i database, ciò include la definizione di uno standard di telemetria del client di database. Si prevede di eseguire operazioni nell'intervallo di tempo di EF7 per consentire l'apertura dei dati di telemetria ai provider di ADO.NET nell'ecosistema .NET. Ciò include l'uso della community sui provider MySQL e Npgsql open source, nonché su Microsoft.Data.Sqlite. Verrà inoltre contattato altri provider e si incoraggiano i gestori di provider di ADO.NET a contattare se interessati.

Miglioramenti a System.Data

Rilevati dai problemi nel repository dotnet\runtime etichettati con area-System.Data nell'attività cardine 7.0

Proposta di valore: migliore accesso ai dati di basso livello per trarre vantaggio da tutto il codice di livello superiore.

Come per ogni versione, si intende esplorare i miglioramenti apportati a . API di accesso al database di basso livello di NET, System.Data. Ci concentreremo sui miglioramenti delle prestazioni (ad esempio, ridurre le allocazioni di memoria eliminando il boxing quando si usa l'API), oltre ad alcuni miglioramenti dell'usabilità.

L'ambito dei miglioramenti precisi verrà determinato in un secondo momento in base alla fattibilità.

Ricerca dell'accesso ai dati per il cloud nativo

Proposta di valore: evoluzione futura dell'accesso ai dati .NET che supporta approcci moderni, ad esempio microservizi e nativi del cloud.

Nell'intervallo di tempo di EF7 si prevede di cercare approcci moderni per l'accesso ai dati tra piattaforme .NET, in particolare in riferimento a microservizi e applicazioni native del cloud. Questa ricerca aiuterà gli investimenti futuri nelle tecnologie di accesso ai dati per .NET.

Tema: Cancellare il percorso da EF6

Tracked by Docs issue #1180: Provide a more complete guide to porting from EF6 (Tenere traccia del problema 1180: Fornire una guida più completa alla conversione da EF6)

Proposta di valore: spostare facilmente l'applicazione da EF6 a EF7.

EF Core ha sempre supportato molti scenari non coperti dallo stack EF6 legacy, oltre a prestazioni generalmente molto più elevate. EF6, tuttavia, presenta scenari supportati analogamente non coperti da EF Core. EF7 aggiungerà il supporto per molti di questi scenari, consentendo a più applicazioni di convertire da EF6 legacy a EF7. Allo stesso tempo, stiamo pianificando una guida completa alla conversione per le applicazioni che passano da EF6 legacy a EF Core.

Gran parte del lavoro in questo tema si sovrappone al lavoro già descritto in precedenza. Alcuni degli elementi di lavoro più significativi sono:

Inoltre, si prevede di rendere chiaro il repository GitHub di EF6 legacy che non stiamo pianificando alcun lavoro futuro su EF6. L'eccezione è che si prevede di aggiungere il supporto per l'uso di EF6 con Microsoft.Data.SqlClient. Questa operazione sarà limitata al supporto di runtime. L'uso della finestra di progettazione ef6 in Visual Studio richiederà System.Data.SqlClientcomunque .

Si noti che EF Core ha un'architettura fondamentalmente diversa rispetto a EF6. In particolare, non usa una specifica ENTITY Data Model (EDM). Ciò significa che alcune funzionalità, ad esempio EDMX ed EntitySQL, non saranno mai supportate in EF Core.

Tema: Prestazioni

Prestazioni elevate è una rete fondamentale di EF Core, l'accesso ai dati di livello inferiore e in effetti tutte le funzionalità .NET. Ogni versione include un lavoro significativo per migliorare le prestazioni. Come sempre, questo tema coinvolgerà un sacco di indagine iterativa, che informerà quindi dove concentriamo le risorse.

Prestazioni degli inserimenti e degli aggiornamenti del database

Rilevato dal problema 26797: Migliorare il rilevamento delle modifiche e le prestazioni degli aggiornamenti

Proposta di valore: inserimenti e aggiornamenti del database a prestazioni elevate da EF Core.

Nelle ultime versioni si è concentrato sul miglioramento delle prestazioni di EF Core sulle query non di rilevamento. Per EF7, si prevede di concentrarsi sulle prestazioni correlate agli inserimenti e agli aggiornamenti del database. Sono incluse le prestazioni delle query di rilevamento delle modifiche, le prestazioni di DetectChangese le prestazioni dei comandi di inserimento e aggiornamento inviati al database.

Parte di questo lavoro include l'implementazione di aggiornamenti in blocco (basati su set), rilevati in precedenza come funzionalità altamente richiesta. Tuttavia, si prevede anche di migliorare le prestazioni degli aggiornamenti tradizionali usando SaveChanges.

Punteggio composito TechEmpower

Tracked by Issue 26796: Improve performance in the TechEmpower composite score

Proposta di valore: aggiornamenti di dati di basso livello con prestazioni elevate per tutte le applicazioni .NET.

Sono stati eseguiti i benchmark TechEmpower standard del settore in .NET su un database PostgreSQL per diversi anni. Nelle ultime due versioni è stato notevolmente migliorato il benchmark Fortunes per l'accesso ai dati di basso livello e EF Core.

Nell'intervallo di tempo di EF7 si prevede di assegnare miglioramenti specifici al punteggio composito TechEmpower. Ciò consente di misurare le prestazioni in un'ampia gamma di scenari.

Funzionalità varie

Rilevati da problemi etichettati type-enhancement con nell'attività cardine 7.0

Proposta di valore: miglioramento continuo di EF Core per soddisfare i requisiti delle applicazioni esistenti e in continua evoluzione.

Le varie funzionalità pianificate per EF 7.0 includono, ma non sono limitate a:

Suggerimenti

I commenti e i suggerimenti dei clienti sulla pianificazione sono importanti. Commentare il problema #26994 di GitHub con qualsiasi feedback o suggerimenti generali sul piano. Il modo migliore per indicare l'importanza di un problema consiste nel votare (👍) per il problema in GitHub. Questi dati verranno quindi inseriti nel processo di pianificazione per la versione successiva.