La documentazione di Entity Framework Core per le Proprietà generate fa sembrare che le annotazioni dei dati possano essere utilizzate per le proprietà del codice generato prima del timestamp , come creato / aggiornato come tipo DateTime
.
Quando si tenta di utilizzare le seguenti annotazioni di dati insieme alle migrazioni prima del codice:
public class Foo {
// some properties
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime Created { get; set; }
// more properties
}
Ricevo il seguente errore quando si tenta di eseguire il comando dotnet ef migrations add AddFooTimestamp
nella riga di comando:
La generazione del valore dell'identità non può essere utilizzata per la proprietà "Creato" sul tipo di entità "Foo" perché il tipo di proprietà è "DateTime". La generazione del valore dell'identità può essere utilizzata solo con proprietà di interi con segno.
Esiste un modo efficace per utilizzare le annotazioni dei dati descritte nella documentazione nei modelli insieme alle migrazioni prima del codice in un ambiente EF Core e SQL Server? O è solo l'annotazione [Timestamp]
che sarebbe disponibile in questo momento?
Il mio progetto utilizza lo strumento Microsoft.EntityFrameworkCore.Tools
versione "1.0.0-preview2-final" e Microsoft.EntityFrameworkCore
e Microsoft.EntityFrameworkCore.SqlServer
versioni "1.1.0".
Grazie per l'aiuto che puoi fornire.
Per avere le proprietà del modello DateTime
impostate nelle azioni INSERT
e UPDATE
, ho utilizzato una combinazione di valori predefiniti tramite la configurazione Fluent API
e i trigger del database. Le annotazioni che ho citato nella mia domanda assolutamente non configurano automaticamente SQL Server per generare valori di DateTime
predefiniti o aggiornati.
Modello:
public class Foo {
// some properties
public DateTime Created { get; set; }
public DateTime LastUpdated { get; set; }
// more properties
}
Valori standard:
protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity<Foo>()
.Property(i => i.Created)
.HasDefaultValueSql("getdate()");
modelBuilder.Entity<Foo>()
.Property(i => i.LastUpdated)
.HasDefaultValueSql("getdate()");
}
Database AFTER UPDATE Trigger:
CREATE TRIGGER [dbo].[Foo_UPDATE] ON [dbo].[Foo]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF ((SELECT TRIGGER_NESTLEVEL()) > 1) RETURN;
DECLARE @Id INT
SELECT @Id = INSERTED.Id
FROM INSERTED
UPDATE dbo.Foo
SET LastUpdated = GETDATE()
WHERE Id = @Id
END
Grazie!