Sto usando EF Core 2.1 per creare un database. Sono in grado di impostare il valore predefinito di una colonna come
public class SchoolContext : DbContext
{
....
protected override void OnModelCreating(ModelBuilder modelBuilder) {
....
modelBuilder.Entity<Student>().Property(s => s.LastLoginDateTime).HasDefaultValueSql("SYSUTCDATETIME()");
}
....
}
Tuttavia, quando provo a utilizzare IEntityTypeConfiguration
per impostare il valore predefinito, viene visualizzato un messaggio di errore (stampato nel codice seguente). Comprendo che HasDefaultValueSql()
non è disponibile in IEntityTypeConfiguration<>
.
Come posso aggirare questa limitazione? A proposito, ho seguito Scott Sauber nel suo 'Personalizing EF Core 2.0+ Entity / Table Mapping con IEntityTypeConfiguration - 11 settembre 2017) per creare il mio SchoolContext
.
https://scottsauber.com/2017/09/11/customizing-ef-core-2-0-with-ientitytypeconfiguration/
Il mio codice:
public class StudentConfig : IEntityTypeConfiguration<Student>
{
public void Configure (EntityTypeBuilder<Student> builder)
{
....
// Error CS1061 'PropertyBuilder<DateTime>' does
// not contain a definition for 'HasDefaultValueSql'
// and no extension method 'HasDefaultValueSql'
// accepting a first argument of Type 'PropertyBuilder<DateTime>'
// could be found (are you missing a using directive
// or an assembly reference?)
// Data C:\Users\Paul\source\repos\School\Data\EFClasses
// \Configurations\StudentConfig.cs 22 Active
builder.Entity<Student>().Property(s => s.RecIn).HasDefaultValueSql("SYSUTCDATETIME()");
....
}
}
Il tipo di parametro builder
del metodo Configure
è EntityTypeBuilder<T>
ed è esattamente lo stesso restituito dal metodo ModelBuilder.Entity<T>
.
Pertanto, quando si utilizza IEntityTypeConfiguration<T>
, è necessario utilizzare direttamente il builder
(senza chiamata Entity<T>()
che è per ModelBuilder
):
public class StudentConfig : IEntityTypeConfiguration<Student>
{
public void Configure(EntityTypeBuilder<Student> builder)
{
builder.Property(s => s.LastLoginDateTime).HasDefaultValueSql("SYSUTCDATETIME()");
}
}
A proposito, il metodo ModelBuilder.Entity<T>()
ha un sovraccarico con l'argomento Action<EntityTypeBuilder<T>
che può essere utilizzato in modo simile:
modelBuilder.Entity<Student>(builder =>
{
builder.Property(s => s.LastLoginDateTime).HasDefaultValueSql("SYSUTCDATETIME()");
});
Aggiornamento: Si noti che HasDefaultValueSql
è il metodo di estensione definito nella classe RelationalPropertyBuilderExtensions
da Microsoft.EntityFrameworkCore.Relational assembly , quindi assicurarsi che il proprio progetto faccia riferimento a esso.