Sono un po 'sorpreso di non aver trovato alcuna informazione sulla seguente domanda, quindi scusami se mi sono perso da qualche parte nei documenti. Utilizzo di SQL Server (2016 localmente e Azure) e codice EFCore Innanzitutto, stiamo cercando di creare una colonna di tabella calcolata con un valore permanente. La creazione della colonna funziona bene, ma non ho idea di come mantenere il valore. Ecco cosa facciamo:
modelBuilder.Entity<SomeClass>(entity =>
{
entity.Property(p => p.Checksum)
.HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName]))");
});
Ed ecco cosa ci piacerebbe davvero ottenere in T-SQL:
CREATE TABLE [dbo].[SomeClass]
(
[FirstColumnName] [NVARCHAR](10)
, [SecondColumnName] [NVARCHAR](10)
, [Checksum] AS (CHECKSUM([FirstColumnName], [SecondColumnName])) PERSISTED
);
Qualcuno può indicarmi la giusta direzione?
Grazie in anticipo, Tobi
AGGIORNAMENTO: Sulla base di una buona idea di @ jeroen-mostert ho anche provato a passare la stringa PERSISTED
come parte della formula:
modelBuilder.Entity<SomeClass>(entity =>
{
entity.Property(p => p.Checksum)
.HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName]) PERSISTED)");
});
E anche al di fuori delle parentesi:
modelBuilder.Entity<SomeClass>(entity =>
{
entity.Property(p => p.Checksum)
.HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName])) PERSISTED");
});
Comunque e in qualche modo sorprendentemente, la colonna calcolata è ancora generata con Is Persisted = No
, quindi la stringa PERSISTED
sembra semplicemente essere ignorata.
Dopo aver fatto alcune letture e alcuni test, ho finito per provare il PERSISTED all'interno della query SQL e ha funzionato.
entity.Property(e => e.Duration_ms)
.HasComputedColumnSql("DATEDIFF(MILLISECOND, 0, duration) PERSISTED");
La migrazione generata era la seguente:
migrationBuilder.AddColumn<long>(
name: "duration_ms",
table: "MyTable",
nullable: true,
computedColumnSql: "DATEDIFF(MILLISECOND, 0, duration) PERSISTED");
Per verificare sul database se è effettivamente persistente ho eseguito quanto segue:
select is_persisted, name from sys.computed_columns where is_persisted = 1
e la colonna che ho creato è lì.