数据库列默认未按预期运行

Database column defaults not behaving as expected

我遇到一个问题,即向数据库写入新条目时没有像我期望的那样使用配置的默认值。

我有一些 类:

public class Benefits
{
    public string Id { get; set; }

    [Required, ForeignKey("Id"), JsonIgnore]
    public Employee Employee { get; set; }

    [Column(TypeName = "money")]
    public decimal BenefitsCost { get; set; }

    [Column(TypeName = "decimal(16,8)"), DefaultValue(1)]
    public decimal Modifier { get; set; }

}

public class BenefitsEmployee : Benefits
{}

public class BenefitsDependent : Benefits
{
    [Required]
    public string NameFirst { get; set; }

    [Required]
    public string NameLast { get; set; }
}

OnModelCreating中:

builder.Entity<BenefitsEmployee>().Property(b => b.BenefitsCost).HasDefaultValue(1000);
builder.Entity<BenefitsDependent>().Property(b => b.BenefitsCost).HasDefaultValue(500);

并且,作为 Configure 中的最后一步,大致:


var user = new {
    Id = "SomeId",
    NameFirst = "FirstName",
    NameLast = "LastName",
    SalaryBase = 0,
    BenefitsCost = 0,
};

var emp = new Employee
{
    Id = user.Id,
    NameFirst = user.NameFirst,
    NameLast = user.NameLast,
    SalaryBase = user.SalaryBase,
    BenefitsEmployee = new BenefitsEmployee
    {
        BenefitsCost = user.BenefitsCost,
    },
};

await context.AddAsync(emp);

await context.SaveChangesAsync();

问题是 BenefitsCost 设置为 1000 并且 Modifier 设置为 0 而不是 01我希望。

我可能做错了什么?

您正在将 0 设置为 BenefitsCost,这是 decimal 类型的默认值。 EF 甚至不会在生成的 SQL 中包含该列。这是因为从 EF 的角度来看,将 0 设置为 BenefitsCost 相当于根本没有设置任何值,它看到的是 - 用户没有设置值并且该列定义了默认值.因此,在生成的 SQL 中不包括该列。对于缺少的列,应该插入配置的默认值。

作为解决方案,您可以将 BenefitsCost 设为可空类型(十进制?)。这样,如果您设置值 0,EF 将知道您已经明确设置了一个值。此外,在您的配置中,您必须将默认值标记为 decimal,例如 1000m500m

对于Modifier,和其他一样在OnModelCreating中配置默认​​值。根据我的经验,使用 [DefaultValue()] 属性设置默认值不起作用。您甚至不会在迁移脚本中找到默认值的提及。可能是一个错误,但我不确定。