← Tutti i corsi
Data · Corso gratuito

Data binding con EF Core

Entity Framework Core è il modo standard di dialogare con un database nel .NET moderno — e Wisej.NET lo collega direttamente alla tua interfaccia. Questo corso ti mostra come collegare le entità ai controlli con un binding bidirezionale pulito, validazione e caricamento asincrono reattivo. Collegherai i modelli EF Core a griglie ed editor, manterrai l'interfaccia reattiva mentre i dati si caricano in background, validerai l'input in ingresso e salverai le modifiche in modo sicuro.

Collega le entità all'interfaccia con binding bidirezionale, validazione e caricamenti asincroni.

Inizia questo corso gratuito

Disponibile anche in: EnglishDeutschFrançaisEspañol

Programma

Modulo 1: Architettura: EF Core dentro un'applicazione Wisej.NET

Modulo 1 di Data binding con EF Core — collega le entità all'interfaccia con binding bidirezionale, validazione e caricamenti asincroni. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sul ciclo di vita del DbContext, supera la verifica delle conoscenze e completa il lab pratico nella Support Desk Data Console.

  1. LetturaGuida della lezione · 14 min

    Dove si colloca EF Core in un'app Wisej.NET con stato: i cicli di vita di sessione, interfaccia, richiesta e unit of work, una DbContextFactory con un Context per operazione, il collegamento verso la DI di Microsoft e le regole di sicurezza tra sessioni. Che cosa significa per uno sviluppatore Wisej.NET che lavora con database reali — e come affrontare questo modulo.

    Leggi la guida della lezione (PDF)

  2. LetturaGuida al lab / esame · 10 min

    Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.

    Leggi la guida della lezione (PDF)

  3. Lezione videoDove vive il DbContext in un'app Wisej.NET · 14 min

    Dove vive il DbContext in un'app Wisej.NET — una videoguida del Modulo 1, costruita passo dopo passo nella Support Desk Data Console. Parte direttamente qui nel player.

    Trascrizione della narrazione

    Avviare la Console dati di Support Desk decidendo quali oggetti vivono per una sessione e quali vivono per un'operazione di database. I moduli Wisej.NET mantengono lo stato utente, ma un Context di database Entity Framework dovrebbe rappresentare una breve unità di lavoro.

    Il modello di programmazione lato server sembra familiare perché controlli, gestori di eventi e origini di associazione rimangono insieme. Non dare al Context la stessa durata. Crealo per una query o una modifica, salvalo quando necessario, quindi eliminalo invece di mantenerlo come stato dell'interfaccia.

    Stato della sessione separato, oggetti dell'interfaccia, richieste individuali e lavoro del database. Un'operazione attesa può riprendere su un altro thread e un Context non è thread-safe. Mantenendolo in una forma di lunga durata si conservano anche le entità tracciate molto tempo dopo l'operazione che ne ha avuto bisogno.

    Utilizza AddDbContextFactory come predefinito in modo che la ricerca, la ricerca, il salvataggio e l'eliminazione possano avere ciascuno un nuovo Context. Un Context di editor modale di lunga durata è un'eccezione deliberata: mantenerlo privato, proteggere l'accesso ed eliminarlo quando l'editor si chiude.

    Registrare la factory di Context nel provider di inserimento delle dipendenze utilizzando le informazioni di connessione configurate. Collega quel provider a Wisej.NET in modo che le pagine risolvano gli stessi servizi registrati. Limitare le impostazioni diagnostiche allo sviluppo ed evitare di introdurre un secondo contenitore di servizi concorrente.

    TicketQueryService memorizza la factory, non un Context condiviso. Ogni metodo crea ed elimina il proprio Context prima di restituire. Ciò impedisce alle modifiche rilevate di un utente di condividere un Context con la query di un altro utente ed evita l'accesso simultaneo a quel Context.

    Mantieni i record selezionati, i filtri, le modifiche in sospeso e le origini di associazione all'interno della sessione. L'archiviazione statica condivisa è appropriata solo per materiale immutabile realmente condiviso, come i dati di riferimento. Un'operazione in background crea inoltre il proprio Context invece di prendere in prestito lo stato del modulo.

    Count mostra l'intero confine dell'operazione. La protezione del caricamento impedisce un secondo invio mentre un nuovo Context conta i ticket. Quando il database non è disponibile, l'errore amichevole spiega l'errore e la pulizia finale ripristina il pulsante per un altro tentativo.

    Crea i livelli della soluzione e la registrazione della fabbrica, quindi risolvi il servizio di query da una pagina ed esegui il conteggio asincrono. Includere la factory in fase di progettazione. La tua recensione dovrebbe essere in grado di identificare dove viene creato ed eliminato ogni Context, senza Context statico da nessuna parte.

  4. LetturaEsercizio di coding con l'IA · 20 min

    Costruisci il progetto SupportDesk di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce — confrontandolo anche con la nostra build di riferimento su GitHub.

    Leggi la guida della lezione (PDF)

  5. VerificaVerifica delle conoscenze — Modulo 1 · 10 min · Soglia di superamento 80%
  6. Laboratorio praticoLab — Scheletro della soluzione e prima query asincrona · 45 min

    Obiettivo: Crea la soluzione Support Desk Data Console con i progetti Web, Data, Services e Tests, aggiungi i pacchetti del provider EF Core al progetto dati, crea SupportDeskContext con una factory di design time, registra AddDbContextFactory nello startup ASP.NET Core ed esponi a Wisej.NET l'IServiceProvider di Microsoft, poi risolvi un servizio di query da una Page Wisej.NET ed esegui una prima query di conteggio asincrona protetta da un flag di caricamento e da un messaggio di errore, senza ancora collegare nulla. Deliverable: soluzione con i progetti Web, Data, Services e Tests e i pacchetti del provider EF Core; SupportDeskContext registrato tramite AddDbContextFactory con una factory di design time; IServiceProvider di Microsoft esposto a Wisej.NET e un servizio di query risolto da una Page; prima query di conteggio asincrona con una protezione di caricamento e un messaggio di errore; nessun DbContext statico in tutta la soluzione.

Modulo 2: Modellazione, configurazione del DbContext e migrazioni

Modulo 2 di Data binding con EF Core — collega le entità all'interfaccia con binding bidirezionale, validazione e caricamenti asincroni. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida su modello, RowVersion e prima migrazione, supera la verifica delle conoscenze e completa il lab pratico nella Support Desk Data Console.

  1. LetturaGuida della lezione · 14 min

    Entità pensate per schermate con data binding, Fluent API per chiavi, lunghezze, indici, comportamento di eliminazione e RowVersion, migrazioni trattate come sorgente da rivedere con script e bundle, e la factory di design time. Che cosa significa per uno sviluppatore Wisej.NET che lavora con database reali — e come affrontare questo modulo.

    Leggi la guida della lezione (PDF)

  2. LetturaGuida al lab / esame · 10 min

    Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.

    Leggi la guida della lezione (PDF)

  3. Lezione videoModello, RowVersion e la prima migrazione · 14 min

    Modello, RowVersion e la prima migrazione — una videoguida del Modulo 2, costruita passo dopo passo nella Support Desk Data Console. Parte direttamente qui nel player.

    Trascrizione della narrazione

    Definire lo schema del Support Desk prima di fare affidamento su schermate associate a dati. Il modello Entity Framework collega le aspettative dell'interfaccia con le regole del database. La configurazione di relazioni, indici e concorrenza rende deliberatamente rivedibile il contratto invece di lasciarlo a valori predefiniti accidentali.

    Guarda i fallimenti che lo schema deve prevenire: una ricerca nella coda non indicizzata, due agenti che sovrascrivono un ticket e un database modificato manualmente che diverge dalla versione successiva. Ogni problema richiede un modello o una decisione di migrazione diversa.

    Mantieni Ticket al centro delle relazioni tra entità, con piccole entità di ricerca e commenti come dettaglio. L'agente facoltativo e il valore della versione hanno significati distinti. Utilizza un elemento di elenco semplice separato per la griglia invece di esporre l'intero grafico.

    Use simple annotations where they are sufficient, and collect production database configuration in OnModelCreating. La configurazione fluida esprime insieme lunghezze, valori richiesti, indici, precisione, valori predefiniti e comportamento delle relazioni, mantenendo le decisioni di mappatura del database vicine al Context.

    Require a bounded title and configure RowVersion for concurrency. Costruisci indici attorno alle ricerche effettivamente eseguite dall'applicazione, incluso lo stato con la data di scadenza. Il comportamento di eliminazione esplicita rende l'effetto sui record correlati una scelta rivista anziché una sorpresa.

    L'aggiornamento corrisponde sia all'identificatore del ticket che alla versione letta originariamente. Se un altro agente ha modificato quella versione, nessuna riga corrisponde. Entity Framework segnala un conflitto di concorrenza, consentendo all'applicazione di spiegare la collisione invece di sostituire silenziosamente il lavoro di qualcun altro.

    Review a migration like any other source change before applying it. Development can apply the reviewed migration directly; la produzione riceve uno script o un bundle ripetibile approvato. Ciò mantiene le modifiche dello schema legate alla revisione del rilascio anziché a diverse istanze dell'applicazione in corsa all'avvio.

    Give the design-time factory the same provider with a safe local development connection. Migration tooling can then build the model without starting Wisej.NET. Separating this path makes schema generation independent of the application’s runtime startup behavior.

    Generate InitialCreate, inspect the planned changes, then apply them to create the tables, version column, and indexes. Semina attraverso un Context di breve durata. I clienti, gli agenti, le categorie e i ticket campione risultanti forniscono alle lezioni vincolanti successive un database coerente da utilizzare.

    Fornisci le cinque entità correlate con regole di eliminazione esplicite, gli indici pianificati e RowVersion. Add the design-time factory and reviewed initial migration, then seed the development database. The hand-in should demonstrate that the model and generated schema agree.

  4. LetturaEsercizio di coding con l'IA · 20 min

    Costruisci il progetto SupportDesk di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce — confrontandolo anche con la nostra build di riferimento su GitHub.

    Leggi la guida della lezione (PDF)

  5. VerificaVerifica delle conoscenze — Modulo 2 · 10 min · Soglia di superamento 80%
  6. Laboratorio praticoLab — Modello, migrazione e dati iniziali · 45 min

    Obiettivo: Crea le entità Customer, Agent, Category, Ticket e TicketComment per la Support Desk Data Console, configura relazioni e comportamenti di eliminazione con la Fluent API, configura RowVersion con IsRowVersion, aggiungi indici per Status, DueDate, CustomerId e UpdatedAt, aggiungi una factory di design time, crea la migrazione InitialCreate e popola un database locale SQLite o SQL Server LocalDB con cinque clienti, tre agenti, le categorie e almeno cinquanta ticket. Deliverable: entità Customer, Agent, Category, Ticket e TicketComment con relazioni e comportamenti di eliminazione; RowVersion configurata con IsRowVersion; indici per Status, DueDate, CustomerId e UpdatedAt; factory di design time e migrazione InitialCreate; dati iniziali: cinque clienti, tre agenti, le categorie e almeno cinquanta ticket.

Modulo 3: Caricare i dati in BindingSource, DataGridView e controlli di lookup

Modulo 3 di Data binding con EF Core — collega le entità all'interfaccia con binding bidirezionale, validazione e caricamenti asincroni. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sul browser dei ticket, supera la verifica delle conoscenze e completa il lab pratico nella Support Desk Data Console.

  1. LetturaGuida della lezione · 14 min

    Esecuzione asincrona delle query LINQ, proiezione senza tracking in elementi di lista, BindingSource come collegamento verso l'interfaccia, mai un IQueryable collegato direttamente, flag di caricamento attorno ai gestori async e ComboBox di lookup con DisplayMember e ValueMember. Che cosa significa per uno sviluppatore Wisej.NET che lavora con database reali — e come affrontare questo modulo.

    Leggi la guida della lezione (PDF)

  2. LetturaGuida al lab / esame · 10 min

    Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.

    Leggi la guida della lezione (PDF)

  3. Lezione videoIl browser dei ticket: ricerca asincrona collegata tramite BindingSource · 14 min

    Il browser dei ticket: ricerca asincrona collegata tramite BindingSource — una videoguida del Modulo 3, costruita passo dopo passo nella Support Desk Data Console. Parte direttamente qui nel player.

    Trascrizione della narrazione

    Crea un browser di ticket che si carica in modo asincrono e associa i risultati tramite BindingSource. Lo schermo necessita di un elenco stabile per la visualizzazione, mentre il servizio di query necessita solo di una breve operazione sul database. La separazione di tali responsabilità mantiene lo stato dell'interfaccia indipendente dal Context.

    Seleziona solo i campi necessari dalle sette colonne della griglia in TicketListItem. Una proiezione senza tracciamento restituisce meno dati ed evita di conservare un grafico di entità modificabile. L’elenco dei browser può quindi sopravvivere al Context della query senza diventare parte del lavoro dell’editor.

    Componi la query prima di eseguirla: aggiungi filtri, ordinamento, limiti di pagina e proiezione. ToListAsync materializza quindi i risultati richiesti una volta. Ciò conferisce al database il lavoro di filtraggio e impaginazione invece di caricare tutto e ritagliarlo nell'interfaccia.

    All'interno di TicketQueryService, crea un Context e aggiungi solo i filtri selezionati dall'utente. Contare le corrispondenze, quindi recuperare la pagina proiettata. La query rimane una descrizione fino al punto di esecuzione asincrona, rendendo esplicito il funzionamento del suo database nel metodo.

    Associa l'elenco materializzato a BindingSource e associa la griglia a tale origine. Non consegnare alla griglia un set di database live. Carica le scelte di ricerca prima della prima ricerca e distingue il testo visualizzato dalla chiave memorizzata come valore selezionato.

    La pagina coordina l'esperienza dell'utente attorno a una chiamata di servizio attesa. Imposta la protezione del caricamento, disabilita i comandi e mostra lo stato prima del caricamento. Assegnare l'elenco restituito, quindi ripristinare i controlli in finally in modo che il successo e il fallimento lascino entrambi una pagina utilizzabile.

    Cerca con testo e stato, quindi confronta le cinquanta righe visibili con il conteggio totale delle corrispondenze. Pagina successiva esegue un'altra query con un nuovo limite di pagina. Solo i risultati proiettati raggiungono il browser; il server non trasferisce il grafico dell'entità sottostante.

    Testare deliberatamente il percorso del server irraggiungibile. L'operatore dovrebbe ricevere un messaggio utile e riprendere la ricerca dopo la pulizia. Un tentativo successivo crea un nuovo Context, quindi un'operazione non riuscita non lascia lo schermo legato a un oggetto di database non riuscito.

    Fornisci il browser con il suo modello di elenco, criteri di ricerca, servizio di query e griglia associata. Carica prima le ricerche e includi la ricerca, il paging in avanti e all'indietro con un conteggio totale. Verificare il caricamento e il ripristino delle protezioni come parte dello stesso flusso di lavoro.

  4. LetturaEsercizio di coding con l'IA · 20 min

    Costruisci il progetto SupportDesk di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce — confrontandolo anche con la nostra build di riferimento su GitHub.

    Leggi la guida della lezione (PDF)

  5. VerificaVerifica delle conoscenze — Modulo 3 · 10 min · Soglia di superamento 80%
  6. Laboratorio praticoLab — Browser dei ticket · 45 min

    Obiettivo: Costruisci il browser dei ticket di Support Desk: i record TicketListItem e TicketSearchCriteria, un metodo SearchTicketsAsync che compone AsNoTracking, Where, OrderBy, Skip, Take e Select prima di ToListAsync, una DataGridView collegata tramite una BindingSource a TicketListItem, ComboBox di lookup per stato e cliente caricate prima della prima ricerca, i pulsanti Search, Next Page e Previous Page, la visualizzazione del conteggio totale e della dimensione di pagina, e una protezione di caricamento che mantiene l'interfaccia utilizzabile dopo un errore. Deliverable: record TicketListItem e TicketSearchCriteria con SearchTicketsAsync; DataGridView collegata a TicketListItem tramite una BindingSource; filtri e paginazione composti nella query così che il lavoro lo faccia il database; ComboBox di lookup caricate prima della prima ricerca, che mostrano i nomi e memorizzano le chiavi; pulsanti Search, Next Page e Previous Page con un conteggio totale e una protezione di caricamento.

Modulo 4: Binding bidirezionale ed editor CRUD

Modulo 4 di Data binding con EF Core — collega le entità all'interfaccia con binding bidirezionale, validazione e caricamenti asincroni. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sull'editor dei ticket, supera la verifica delle conoscenze e completa il lab pratico nella Support Desk Data Console.

  1. LetturaGuida della lezione · 14 min

    DataBindings e BindingSource negli editor, EndEdit, CancelEdit, AddNew e RemoveCurrent, binding diretto alle entità contro binding a un modello di modifica, e flussi di salvataggio, annullamento, eliminazione e ricaricamento che terminano in SaveChangesAsync. Che cosa significa per uno sviluppatore Wisej.NET che lavora con database reali — e come affrontare questo modulo.

    Leggi la guida della lezione (PDF)

  2. LetturaGuida al lab / esame · 10 min

    Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.

    Leggi la guida della lezione (PDF)

  3. Lezione videoL'editor dei ticket: EndEdit, mappatura, SaveChangesAsync · 14 min

    L'editor dei ticket: EndEdit, mappatura, SaveChangesAsync — una videoguida del Modulo 4, costruita passo dopo passo nella Support Desk Data Console. Parte direttamente qui nel player.

    Trascrizione della narrazione

    Trasforma la finestra di dialogo del ticket in un confine di modifica sicuro. L'utente acquisisce familiarità con i comandi Salva, Annulla ed Elimina, mentre il server controlla quando l'input raggiunge il modello e quando Entity Framework lo scrive. Il modulo modale non dovrebbe diventare un Context di database permanente.

    Prima di salvare o eliminare, applica la parte del contratto del server: completa le modifiche in sospeso, crea un nuovo Context per l'operazione e previeni invii duplicati. Un dialogo familiare è affidabile solo quando questi passaggi nascosti concordano con ciò che promettono i pulsanti.

    Collega i controlli da TicketEditModel a BindingSource e scegli quando aggiornare ciascun valore. Text e aggiornamento delle date alla convalida; le ricerche si aggiornano man mano che la loro proprietà cambia. I metodi di modifica BindingSource gestiscono l'elemento corrente, ma nessuno di essi sostituisce un salvataggio nel database.

    Scegli il limite vincolante in base alle responsabilità del redattore. L'associazione diretta di entità può adattarsi a un aggregato di breve durata con un Context privato. Un modello di modifica rende espliciti la convalida e gli aggiornamenti parziali consentiti ed evita di trattare una proiezione della griglia di sola lettura come un'entità modificabile.

    Segui una sequenza di salvataggio: proteggi, completa le modifiche, convalida, carica o crea con un nuovo Context, mappa i valori consentiti e salva. Chiudi correttamente solo dopo che la persistenza ha avuto esito positivo. Gestisci la concorrenza separatamente dagli altri errori del database in modo che l'utente riceva la giusta spiegazione.

    In SaveAsync, controlla l'ordine anziché solo i nomi dei metodi. EndEdit deve precedere la validazione; la creazione del Context segue l'input accettato. Il caricamento tramite tasto e la mappatura dal modello di modifica definiscono ciò che viene scritto, mentre finally rilascia la guardia di salvataggio ad ogni uscita.

    L'eliminazione inizia con la conferma, quindi ricarica il ticket tramite chiave in un nuovo Context. Se è già scomparso, spiegalo invece di trattarlo come una normale rimozione. Controllare la regola aziendale prima di rimuovere e salvare il record.

    Modifica il titolo e l'urgenza nell'editor modale, quindi salva. Lo stato occupato copre la persistenza e un risultato positivo della finestra di dialogo chiude l'editor. Il browser principale esegue nuovamente la ricerca, quindi la riga visualizzata deriva dallo stato del database salvato anziché da presupposti sulla modifica.

    Crea moduli di aggiunta e modifica attorno a TicketEditModel, BindingSource e ErrorProvider. Include il caricamento, il salvataggio custodito, l'eliminazione confermata e l'aggiornamento principale. Verificare che l'annullamento di una modifica e il completamento di un salvataggio riuscito producano effetti diversi e prevedibili sul browser.

  4. LetturaEsercizio di coding con l'IA · 20 min

    Costruisci il progetto SupportDesk di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce — confrontandolo anche con la nostra build di riferimento su GitHub.

    Leggi la guida della lezione (PDF)

  5. VerificaVerifica delle conoscenze — Modulo 4 · 10 min · Soglia di superamento 80%
  6. Laboratorio praticoLab — Form per aggiungere e modificare ticket · 45 min

    Obiettivo: Costruisci i form modali Add Ticket ed Edit Ticket per la Support Desk Data Console: un TicketEditModel, un TicketEditorForm con una BindingSource e un ErrorProvider, proprietà di TextBox, ComboBox, DateTimePicker e CheckBox collegate al modello, LoadEditorAsync per ticket nuovi ed esistenti, SaveAsync che chiama EndEdit, un segnaposto per la validazione, la mappatura e SaveChangesAsync, Delete con conferma e un caricamento aggiornato dell'entità, e una griglia padre che si aggiorna dopo DialogResult.OK. Deliverable: TicketEditModel e TicketEditorForm con una BindingSource e un ErrorProvider; proprietà di TextBox, ComboBox, DateTimePicker e CheckBox collegate al modello di modifica; LoadEditorAsync per ticket nuovi ed esistenti e SaveAsync con EndEdit, mappatura e SaveChangesAsync; Delete con conferma, un caricamento aggiornato dell'entità e una gestione pulita dei record già eliminati; griglia padre aggiornata dopo DialogResult.OK, e Cancel che non salva nulla.

Modulo 5: Validazione, ErrorProvider e feedback all'utente

Modulo 5 di Data binding con EF Core — collega le entità all'interfaccia con binding bidirezionale, validazione e caricamenti asincroni. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sul feedback di validazione, supera la verifica delle conoscenze e completa il lab pratico nella Support Desk Data Console.

  1. LetturaGuida della lezione · 14 min

    Tre livelli di validazione, DataAnnotations sui modelli di modifica, un servizio TicketValidator che restituisce messaggi per campo e di riepilogo, ErrorProvider e riepiloghi come feedback in Wisej.NET, e DbUpdateException come ultimo livello di sicurezza. Che cosa significa per uno sviluppatore Wisej.NET che lavora con database reali — e come affrontare questo modulo.

    Leggi la guida della lezione (PDF)

  2. LetturaGuida al lab / esame · 10 min

    Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.

    Leggi la guida della lezione (PDF)

  3. Lezione videoValida prima di salvare: ErrorProvider e riepiloghi · 14 min

    Valida prima di salvare: ErrorProvider e riepiloghi — una videoguida del Modulo 5, costruita passo dopo passo nella Support Desk Data Console. Parte direttamente qui nel player.

    Trascrizione della narrazione

    Aggiungi la convalida prima che l'editor del ticket raggiunga il database. Gli utenti hanno bisogno di una spiegazione su cui poter agire, mentre il server necessita ancora dei controlli finali di coerenza. Questo modulo collega le regole del modello, il feedback sul campo e la gestione degli errori del database in un'unica esperienza di salvataggio comprensibile.

    Mantieni tutti e tre i livelli di convalida perché proteggono confini diversi. I controlli dell'interfaccia forniscono una guida immediata, le regole del dominio si applicano anche al di fuori di questo modulo e i vincoli del database proteggono la coerenza finale. Il superamento del primo strato non elimina la necessità degli altri.

    Non dare per scontato che SaveChangesAsync esegua le annotazioni del modello di modifica. L'attributo Required aiuta a descrivere la mappatura su un'entità, ma il modello di input necessita di una chiamata di convalida esplicita. TryValidateObject è il passaggio che trasforma le regole dichiarate in controlli effettivi.

    TicketValidator restituisce nomi di campi e messaggi dopo aver eseguito le annotazioni e la regola del ticket chiuso. Non ha alcuna dipendenza dai controlli Wisej.NET, quindi i casi negativi possono essere testati senza aprire un modulo. L'interfaccia decide successivamente dove visualizzare ciascun risultato.

    Cancella il vecchio feedback, completa la modifica e convalida il modello corrente prima di creare un Context. Indirizza ciascun risultato al suo input e anche al riepilogo. Il ritorno a questo punto impedisce ai dati non validi di avviare un'operazione di database non necessaria.

    Mantenere la convalida e la gestione delle eccezioni nell'ordine corretto. Restituzioni di input non valide prima del salvataggio; un'eccezione di concorrenza viene rilevata prima delle eccezioni di database più ampie. Registra i dettagli tecnici sul server, aggiorna le ricerche quando necessario e ripristina sempre Salva in finally.

    Combina un titolo vuoto con una data di scadenza futura su un ticket chiuso. Entrambi gli input dovrebbero ricevere feedback utili e apparire nel riepilogo, mentre Salva rimane non disponibile. Correggere entrambi i valori per confermare che la cancellazione degli errori segue la validità attuale del modello.

    Un modello di input valido può comunque fallire quando un altro agente crea lo stesso numero di ticket. L'indice univoco rifiuta il duplicato durante il salvataggio. Traduci l'errore in una spiegazione semplice per l'utente, conservando i dettagli del database solo nel registro diagnostico.

    Fornisci insieme il modello di modifica annotato, il validatore indipendente, il feedback sul campo e il riepilogo. Aggiungi la traduzione del numero duplicato e mantieni Salva disabilitato per input non validi. I cinque test negativi dovrebbero esercitare direttamente le regole, dimostrando che non dipendono da una forma visibile.

  4. LetturaEsercizio di coding con l'IA · 20 min

    Costruisci il progetto SupportDesk di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce — confrontandolo anche con la nostra build di riferimento su GitHub.

    Leggi la guida della lezione (PDF)

  5. VerificaVerifica delle conoscenze — Modulo 5 · 10 min · Soglia di superamento 80%
  6. Laboratorio praticoLab — Validazione ed errori comprensibili · 45 min

    Obiettivo: Aggiungi la validazione all'editor dei ticket di Support Desk: DataAnnotations su TicketEditModel, un TicketValidator che restituisce errori per campo e di riepilogo, un ErrorProvider azzerato prima di ogni esecuzione e impostato per Title, Customer, Category e DueDate, una label di riepilogo per le regole tra più campi, Save disabilitato finché il modello non è valido, un gestore di DbUpdateException che mostra un messaggio comprensibile per un numero di ticket duplicato, e almeno cinque casi di test negativi. Deliverable: DataAnnotations su TicketEditModel e un TicketValidator che restituisce errori per campo e di riepilogo; ErrorProvider azzerato prima di ogni esecuzione e impostato per Title, Customer, Category e DueDate; label di riepilogo per le regole tra più campi e Save disabilitato finché il modello non è valido; DbUpdateException gestita con un messaggio comprensibile per un numero di ticket duplicato; almeno cinque casi di test negativi.

Modulo 6: Caricamenti asincroni, dati correlati, filtri e prestazioni

Modulo 6 di Data binding con EF Core — collega le entità all'interfaccia con binding bidirezionale, validazione e caricamenti asincroni. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida che porta una griglia lenta a una paginata, supera la verifica delle conoscenze e completa il lab pratico nella Support Desk Data Console.

  1. LetturaGuida della lezione · 14 min

    La tabella di decisione per i dati correlati (proiezione, Include, Include filtrato, caricamento esplicito, nessun lazy loading nelle griglie), tracking contro no-tracking, paginazione e filtri indicizzati, coordinamento asincrono con stati di caricamento e attività in background, e misurare prima di ottimizzare. Che cosa significa per uno sviluppatore Wisej.NET che lavora con database reali — e come affrontare questo modulo.

    Leggi la guida della lezione (PDF)

  2. LetturaGuida al lab / esame · 10 min

    Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.

    Leggi la guida della lezione (PDF)

  3. Lezione videoDa una griglia lenta a una paginata e proiettata · 14 min

    Da una griglia lenta a una paginata e proiettata — una videoguida del Modulo 6, costruita passo dopo passo nella Support Desk Data Console. Parte direttamente qui nel player.

    Trascrizione della narrazione

    Utilizza il lento browser dei ticket per misurare ciò che fa effettivamente il database. L'obiettivo è una query pianificata e impaginata con prove dal registro. Confrontando la stessa ricerca prima e dopo si vede se il miglioramento deriva da meno lavoro piuttosto che da un'impressione visiva.

    La formattazione delle celle sembra innocua finché la lettura di una proprietà di navigazione non attiva il caricamento lento. La query iniziale del ticket è seguita da query sui dati correlati per ogni riga. Contare queste affermazioni per scoprire perché la visualizzazione di cinquanta righe può produrre centocinquantuno comandi di database.

    Scegli il caricamento dei dati correlati in base al risultato di cui hai bisogno. La proiezione si adatta a un modello di display piatto; Include si adatta a un aggregato controllato, con filtraggio o caricamento esplicito ove appropriato. Evita l'accesso lento alla navigazione nella griglia perché il costo del database è nascosto nel codice di presentazione.

    Utilizza il monitoraggio quando l'editor salverà le stesse istanze di entità. Elenchi di sola lettura, ricerche, esportazioni e dashboard in genere non ne hanno bisogno. La risoluzione dell'identità è una scelta separata per un grafico di sola lettura che necessita ancora di un'istanza per ogni entità ripetuta.

    Filtra in base alle colonne indicizzate, conta le corrispondenze e recupera una pagina di cinquanta elementi dell'elenco previsti. La selezione di nomi correlati nella query consente al database di unirli una volta. La formattazione delle righe restituite utilizza quindi i valori disponibili invece di causare ulteriori letture del database.

    Abilita la registrazione dei comandi in fase di sviluppo prima di scegliere un'ottimizzazione. Esaminare il conteggio e la durata dei comandi per individuare il collo di bottiglia. Le query compilate, il pooling, le query suddivise o le istruzioni grezze del database dovrebbero soddisfare un'esigenza misurata, non aggiungere complessità prima che la query ordinaria venga compresa.

    Confronta le ricerche registrate: centocinquantuno query diventano due, con il conteggio totale ancora presente. La durata misurata scende a trentotto millisecondi. La ricerca e il paging rimangono disabilitati durante il caricamento, quindi il percorso del database più veloce preserva anche il comportamento coordinato dell'interfaccia.

    Attendere un'operazione prima di avviarne un'altra sullo stesso Context. Per un’elaborazione in background più lunga, crea il Context all'interno di Application.StartTask e segnala i progressi tramite Application.Update. Mantenere la proprietà locale rispetto all'attività evita di condividere un Context attraverso l'interfaccia simultanea e le operazioni in background.

    Registra i comandi e la durata originali, quindi sostituisci la query a griglia con una proiezione senza tracciamento e pagine di cinquanta righe. Rimuovi le letture di navigazione pigre dal codice di presentazione. La tua nota prima e dopo dovrebbe collegare il miglioramento misurato al lavoro sul database che è stato eliminato.

  4. LetturaEsercizio di coding con l'IA · 20 min

    Costruisci il progetto SupportDesk di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce — confrontandolo anche con la nostra build di riferimento su GitHub.

    Leggi la guida della lezione (PDF)

  5. VerificaVerifica delle conoscenze — Modulo 6 · 10 min · Soglia di superamento 80%
  6. Laboratorio praticoLab — Misura e ottimizza il browser dei ticket · 45 min

    Obiettivo: Ottimizza il browser dei ticket di Support Desk: abilita il logging di EF Core in sviluppo, registra l'SQL e i tempi della ricerca non ottimizzata, sostituisci il caricamento delle entità con una proiezione, aggiungi AsNoTracking alle query delle griglie, aggiungi la paginazione con una dimensione di pagina di 50, sostituisci l'accesso lazy alle navigazioni con una proiezione o con Include, e documenta nelle note del lab i risultati misurati prima e dopo. Deliverable: logging di EF Core abilitato in sviluppo con l'SQL e i tempi non ottimizzati registrati; query della griglia riscritta come proiezione senza tracking; paginazione con dimensione di pagina di 50 e filtri indicizzati; nessun comportamento N+1 da lazy loading rimasto nel codice di visualizzazione; note del lab che documentano il miglioramento misurato prima e dopo.

Modulo 7: Concorrenza, transazioni, rilascio, diagnostica e capstone

Modulo 7 di Data binding con EF Core — collega le entità all'interfaccia con binding bidirezionale, validazione e caricamenti asincroni. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sulla risoluzione dei conflitti, supera la verifica delle conoscenze e completa il lab pratico nella Support Desk Data Console.

  1. LetturaGuida della lezione · 14 min

    Concorrenza ottimistica con RowVersion e DbUpdateConcurrencyException, un dialogo di conflitto con ricarica, sovrascrittura e unione, transazioni e strategie di esecuzione, configurazione e logging specifici per ambiente, una strategia di test e il capstone Support Desk. Che cosa significa per uno sviluppatore Wisej.NET che lavora con database reali — e come affrontare questo modulo.

    Leggi la guida della lezione (PDF)

  2. LetturaGuida al lab / esame · 10 min

    Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.

    Leggi la guida della lezione (PDF)

  3. Lezione videoDue utenti, un ticket: risolvere il conflitto · 14 min

    Due utenti, un ticket: risolvere il conflitto — una videoguida del Modulo 7, costruita passo dopo passo nella Support Desk Data Console. Parte direttamente qui nel player.

    Trascrizione della narrazione

    Completa la console Support Desk proteggendo le modifiche apportate in sessioni diverse. Due operatori possono aprire lo stesso ticket, quindi un salvataggio riuscito non deve cancellare silenziosamente una modifica apportata dal caricamento dell'editor. Il capstone collega tale protezione alla distribuzione e alla diagnostica.

    Dana chiude il ticket mentre Priya ha ancora una modifica precedente aperta. Salvare la modifica della priorità di Priya senza controllare la versione originale potrebbe ripristinare il vecchio stato. RowVersion rileva che il record è cambiato, trasformando una sovrascrittura silenziosa in un conflitto esplicito.

    Porta con te la versione che l'utente ha effettivamente visto in TicketEditModel. Quando si salva con un'entità appena caricata, assegnare la versione trasportata come valore originale. Altrimenti il ​​Context verrebbe confrontato con la sua nuova lettura, perdendo le modifiche apportate mentre l'utente stava modificando.

    Dopo aver ripristinato la versione originale, rileva l'eccezione di concorrenza e controlla ogni voce interessata. Leggere i valori correnti del database per creare l'elenco dei conflitti; una riga del database mancante indica la cancellazione. Confronta proprietà diverse in modo che la finestra di dialogo possa spiegare la collisione effettiva.

    Presentare il conflitto utilizzando i nomi dei campi e l'utente, il database e i valori originali. Ricarica accetta i dati del database corrente; la sovrascrittura richiede l'autorizzazione dei criteri, mentre l'unione decide per campo. Dopo la risoluzione, aggiorna la griglia in modo che lo schermo circostante corrisponda al risultato scelto.

    Uno SaveChangesAsync fornisce già una transazione per le sue modifiche. Utilizzare una transazione esplicita quando più operazioni devono riuscire insieme. Con il tentativo abilitato, posiziona l'intera unità all'interno della strategia di esecuzione in modo che un nuovo tentativo ripeta la transazione completa anziché un frammento isolato.

    Mantieni i segreti della connessione di produzione all'esterno del codice sorgente e distribuisci migrazioni ripetibili riviste durante il rilascio. Disabilita la registrazione dei dati sensibili al di fuori dello sviluppo. Testare i servizi indipendentemente dall'interfaccia, utilizzando un database relazionale in cui il comportamento sotto test dipende da regole relazionali.

    Esegui la collisione tra due sessioni: Dana salva prima, poi Priya vede lo stato e la priorità in conflitto accanto ai valori del database. Scegliendo Ricarica si aggiorna la versione dell'editor e si aggiorna la griglia. Il risultato visibile dimostra che il salvataggio obsoleto è stato interrotto anziché accettato silenziosamente.

    Esamina la console come un unico sistema connesso: browser proiettato, caricamento delle ricerche, modifica del modello, feedback, protezioni e controllo della versione. Il piano di migrazione e la nota sull'architettura spiegano come rimane gestibile. La valutazione premia insieme architettura, rilegatura e correttezza Entity Framework.

    Invia un conflitto riproducibile di due sessioni con la versione originale portata in salvataggio e una chiara finestra di dialogo di risoluzione. Includi note di distribuzione, lo script di migrazione esaminato e le impostazioni di registrazione sicure. La revisione capstone dovrebbe essere in grado di ripetere il conflitto e verificarne la risoluzione.

  4. LetturaEsercizio di coding con l'IA · 20 min

    Costruisci il progetto SupportDesk di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce — confrontandolo anche con la nostra build di riferimento su GitHub.

    Leggi la guida della lezione (PDF)

  5. VerificaVerifica delle conoscenze — Modulo 7 · 10 min · Soglia di superamento 80%
  6. Laboratorio praticoLab — Concorrenza e capstone · 45 min

    Obiettivo: Rendi la Support Desk Data Console sicura per più utenti: aggiungi RowVersion al modello di modifica e al suo stato nascosto, imposta OriginalValue prima di salvare un'entità esistente, riproduci un conflitto modificando lo stesso ticket in due sessioni del browser, intercetta DbUpdateConcurrencyException, costruisci un elenco dei conflitti con i valori proposti e quelli del database, aggiungi i percorsi Reload e Overwrite secondo la policy, genera uno script SQL di migrazione idempotente con note di rilascio e stringhe di connessione specifiche per ambiente, tieni disattivato il logging dei dati sensibili fuori dallo sviluppo, poi completa la revisione del capstone. Deliverable: RowVersion portata nel modello di modifica e impostata come OriginalValue prima del salvataggio; conflitto di concorrenza riproducibile intercettato come DbUpdateConcurrencyException; dialogo di conflitto che elenca i valori proposti e quelli del database con i percorsi Reload e Overwrite; script SQL di migrazione idempotente con note di rilascio e stringhe di connessione specifiche per ambiente; logging dei dati sensibili disattivato fuori dallo sviluppo e revisione del capstone completata.