Quando lavoriamo con un'entity non siamo sempre noi a decidere il valore di tutte le sue proprietà. A volte infatti è il database a decidere il valore di una proprietà nel momento in cui l'entity viene persistita. Un tipico esempio di quando il database decide il valore di una proprietà è nel caso delle colonne di tipo identity o nel caso di colonne aggiornate con un trigger.
In questi casi possiamo istruire Entity Framework Core per recuperare queste proprietà dal database una volta generate. Per fare questo abbiamo a disposizione l'attributo DatabaseGenerated a cui passiamo l'enum DatabaseGeneratedOption. Questo enum ha i seguenti valori:
- Identity: il valore viene generato dal database in fase di insert
- Computed:il valore viene generato dal database sia in fase di insert che di update
- None: il valore viene deciso dal codice (default)
Il prossimo esempio mostra come utilizzare l'attributo.
public class Person { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string FullName { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime LastUpdated { get; set; } }
In alternativa all'utilizzo delle data annotation possiamo usare il codice tramite i seguenti metodi:
- ValueGeneratedOnAdd: equivalente a Identity
- ValueGeneratedOnAddOrUpdate: equivalente a Computed
- ValueGeneratedNever: equivalente a None
class MyContext : DbContext { public DbSet<Person> People { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Person>() .Property(b => b.Id) .ValueGeneratedOnAdd(); modelBuilder.Entity<Person>() .Property(b => b.LastUpdated) .ValueGeneratedOnAddOrUpdate(); } }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Le novità di Angular: i miglioramenti alla CLI
Installare le Web App site extension tramite una pipeline di Azure DevOps
Utilizzare database e servizi con gli add-on di Container App
Usare le collection expression per inizializzare una lista di oggetti in C#
Utilizzare la session affinity con Azure Container Apps
Cambiare la chiave di partizionamento di Azure Cosmos DB
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Eseguire una GroupBy per entity in Entity Framework
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Utilizzare un service principal per accedere a Azure Container Registry
Usare lo spread operator con i collection initializer in C#
Evitare (o ridurre) il repo-jacking sulle GitHub Actions