EF 2.1 Core IEntityTypeConfiguration 添加默认值



我正在使用EF Core 2.1创建数据库。 我可以设置列的默认值,例如

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

但是,当我尝试使用IEntityTypeConfiguration设置默认值时,我收到生成错误消息(打印在下面的代码中(。我知道HasDefaultValueSql()IEntityTypeConfiguration<>不可用。

我该如何解决该限制? 顺便说一下,我按照 Scott Sauber 在他的"使用 IEntityTypeConfiguration 自定义 EF Core 2.0+ 实体/表映射 - 2017 年 9 月 11 日"(中创建我的SchoolContext

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

我的代码:

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:UsersPaulsourcereposSchoolDataEFClasses
// ConfigurationsStudentConfig.cs 22  Active
builder.Entity<Student>().Property(s => s.RecIn).HasDefaultValueSql("SYSUTCDATETIME()");
....
}
}

Configure方法的builder参数类型是EntityTypeBuilder<T>,并且与ModelBuilder.Entity<T>方法返回的参数类型完全相同。

所以当使用IEntityTypeConfiguration<T>时,你应该直接使用builder(没有Entity<T>()调用,这是为了ModelBuilder(:

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

顺便说一句,ModelBuilder.Entity<T>()方法具有重载Action<EntityTypeBuilder<T>参数,可以以类似的方式使用:

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

更新:请注意,HasDefaultValueSql是在Microsoft.EntityFrameworkCore.RelationalAssemblyRelationalPropertyBuilderExtensions类中定义的扩展方法,因此请确保您的项目引用了它。

最新更新