HasDefaultValue/HasDefaultValueSql 不适用于 SQL Server - Fluent API with EF core 5

问题描述

POCO 模型:

    public partial class Enterprise
    {
        public Enterprise()
        {
        }

        public int Id { get; set; }
        public string Domain { get; set; }
        public string Name { get; set; }
        public DateTime? CreatedAt { get; set; }
        public DateTime? UpdatedAt { get; set; }
    }

流畅的 API 使用:

    public partial class EnterpriseContext : DbContext
    {
        public EnterpriseContext ()
        {
        }

        public EnterpriseContext (DbContextOptions<EnterpriseContext> options)
            : base(options)
        {
        }
        public virtual DbSet<Enterprise> Enterprise { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Enterprise>(entity =>
            {
                entity.Property(e => e.CreatedAt).HasColumnType("datetime").HasDefaultValuesql(" 
                                                                                (getdate())");

                entity.Property(e => e.Domain).HasColumnName("Domain")
                .HasMaxLength(255).HasDefaultValue("test");

                entity.Property(e => e.Name).HasMaxLength(255);

                entity.Property(e => e.UpdatedAt)
                .HasColumnName("UpdatedAt")
                .HasColumnType("datetime")
                .ValueGeneratedOnAdd()
                .HasDefaultValuesql("getdate()");
            });
           }
   }

数据库实体保存到数据库中的代码

Enterprise enterprise = new Enterprise();
enterprise.Name = "random";
_context.Enterprise.Add(enterprise);
_context.SaveChanges();

这会根据 EF 核心日志生成以下查询

[2021-04-20T09:25:14.145Z] Executed DbCommand (69ms) [Parameters=[@p0='?' (Size = 255)],CommandType='Text',CommandTimeout='30']
[2021-04-20T09:25:14.147Z] SET NOCOUNT ON;
[2021-04-20T09:25:14.148Z] INSERT INTO [Enterprise] ([Name])
[2021-04-20T09:25:14.149Z] VALUES (@p0);

在 Fluent API 中配置了认值的列,即 CreatedAt,Domain 在 DB 中被设置为 NULL。 所以,问题是为什么 Fluent API 配置在这里工作。 我在 Fluenet API 配置中尝试了很多 P&C 但无济于事。 任何帮助将不胜感激。谢谢!

解决方法

这是因为您将模型上的属性定义为 DateTime?,这意味着它们是可空字段,因此 EF Core 也会使它们在 SQL Server 中为可空列。您可以通过在 .IsRequired(true) 之前添加 .HasDefaultValue() 或将它们转换为常规的不可为 null 的 DateTime 属性来解决此问题。