简体   繁体   中英

EF 2.1 Core IEntityTypeConfiguration Add default value

I am using EF Core 2.1 to create a database. I am able to set the default value of a column like

public class SchoolContext : DbContext
{
    ....
    protected override void OnModelCreating(ModelBuilder modelBuilder) {
        ....
         modelBuilder.Entity<Student>().Property(s => s.LastLoginDateTime).HasDefaultValueSql("SYSUTCDATETIME()");
    }
    ....
}

However, when I try to use the IEntityTypeConfiguration to set the default value, I get the build an error message (printed in the code below). I understand that the HasDefaultValueSql() is not available in IEntityTypeConfiguration<> .

How can I work around with that limitation? By the way, I followed the Scott Sauber in his 'Customizing EF Core 2.0+ Entity/Table Mapping with IEntityTypeConfiguration - Sept 11, 2017) to create my SchoolContext .

https://scottsauber.com/2017/09/11/customizing-ef-core-2-0-with-ientitytypeconfiguration/

My code:

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()");
        ....
    }
}

The builder parameter type of the Configure method is EntityTypeBuilder<T> , and is exactly the same returned by ModelBuilder.Entity<T> method.

So when using IEntityTypeConfiguration<T> , you should use builder directly (w/o Entity<T>() call which is for ModelBuilder ):

public class StudentConfig : IEntityTypeConfiguration<Student>
{
    public void Configure(EntityTypeBuilder<Student> builder)
    {
        builder.Property(s => s.LastLoginDateTime).HasDefaultValueSql("SYSUTCDATETIME()");
    }
}

Btw, the ModelBuilder.Entity<T>() method has overload with Action<EntityTypeBuilder<T> argument which can be uses in a similar fashion:

modelBuilder.Entity<Student>(builder =>
{
    builder.Property(s => s.LastLoginDateTime).HasDefaultValueSql("SYSUTCDATETIME()");
});

Update: Please note that HasDefaultValueSql is extension method defined in RelationalPropertyBuilderExtensions class from Microsoft.EntityFrameworkCore.Relational assembly , so make sure your project is referencing it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM