Finora ho letto i documenti, i tutorial su google e altre domande su SO, ma a quanto pare mi manca qualcosa e non capisco (per funzionare).
Cerco di implementare un database PostgreSQL veramente piccolo per un web API .NET Core 2.1 (microservice). Sono abituato al primo approccio del database, ma per questo servizio ho deciso di provare il codice per primo.
Ho anche deciso di utilizzare l'api fluente di ModelBuilder per mantenere le classi pulite dagli attributi e definire la maggior parte della struttura nel metodo DbContext.OnModelCreating. Andy forse una volta trova una soluzione su come mantenere pulito DbContext dagli elementi specifici di Postgres e spostarli verso le migrazioni ...
Il mio problema è che i requisiti definiscono molti valori predefiniti e non riesco a farli funzionare come dovrebbero comportarsi.
Ad esempio, ho la tabella Entity1 che ha solo le 3 colonne:
L'idea alla base del valore predefinito per il timestamp consiste nel fatto che il database sia l'istanza singola che crea timestamp e utilizza i valori predefiniti del database come configurazione per tutte le istanze in esecuzione. Per esempio. quando i requisiti cambiano in "il valore predefinito ora dovrebbe essere falso" cambiamo semplicemente i valori predefiniti del database nei database esistenti e aggiorniamo la migrazione per le nuove versioni.
Il mio codice ModelBuilder al momento è:
modelBuilder.Entity<Entity1>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.ValueGeneratedOnAdd();
entity.Property(e => e.IsEnabled)
.HasDefaultValue(true)
.ValueGeneratedOnAddOrUpdate();
entity.Property(e => e.LastStatusChange)
.HasColumnType("timestamp without time zone")
.HasDefaultValueSql("CURRENT_TIMESTAMP")
.ValueGeneratedOnAddOrUpdate();
});
Che funziona per i nuovi valori creati.
Quando si alterna o si ripristinano i campi che utilizzo
entity.LastStatusChange = null;
e o
entity.IsEnabled = null;
Ho assunto che impostandoli su null si innesca la creazione di un valore predefinito, ma questo non ha effetto sul campo LastStatusChange (il valore rimane lo stesso) e imposta IsEnabled su null.
In ogni caso, per ottenere i valori predefiniti di db in fase di aggiornamento tramite l'entity framework core?
Come menzionano i documenti EF Core , HasDefaultValue()
e HasDefaultValueSql()
specificano solo il valore che viene impostato quando viene inserita una nuova riga. Impostare una colonna su null è una cosa completamente diversa (dopotutto, null è un valore valido per quelle colonne). Potresti cercare colonne calcolate , che è una funzionalità diversa.
Sfortunatamente, come menzionano i documenti di Npgsql , le colonne calcolate non sono attualmente supportate da PostgreSQL. È possibile configurarlo utilizzando i trigger del database PostgreSQL , ma questo non è gestito da EF Core, quindi per configurare questo è necessario utilizzare SQL nelle migrazioni.
Soluzione per CreateDate in PostgreSQL:
builder.Property(e => e.CreationDate)
.HasColumnType("timestamp without time zone")
.HasDefaultValueSql("NOW()")
.ValueGeneratedOnAdd();
Sfortunatamente non esiste una soluzione per l'evento di aggiornamento.