问题描述
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();
[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
属性来解决此问题。