数据库列默认未按预期运行
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
而不是 0
和 1
我希望。
我可能做错了什么?
您正在将 0
设置为 BenefitsCost
,这是 decimal
类型的默认值。 EF 甚至不会在生成的 SQL 中包含该列。这是因为从 EF 的角度来看,将 0
设置为 BenefitsCost
相当于根本没有设置任何值,它看到的是 - 用户没有设置值并且该列定义了默认值.因此,在生成的 SQL 中不包括该列。对于缺少的列,应该插入配置的默认值。
作为解决方案,您可以将 BenefitsCost
设为可空类型(十进制?)。这样,如果您设置值 0
,EF 将知道您已经明确设置了一个值。此外,在您的配置中,您必须将默认值标记为 decimal
,例如 1000m
、500m
等
对于Modifier
,和其他一样在OnModelCreating
中配置默认值。根据我的经验,使用 [DefaultValue()]
属性设置默认值不起作用。您甚至不会在迁移脚本中找到默认值的提及。可能是一个错误,但我不确定。
我遇到一个问题,即向数据库写入新条目时没有像我期望的那样使用配置的默认值。
我有一些 类:
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
而不是 0
和 1
我希望。
我可能做错了什么?
您正在将 0
设置为 BenefitsCost
,这是 decimal
类型的默认值。 EF 甚至不会在生成的 SQL 中包含该列。这是因为从 EF 的角度来看,将 0
设置为 BenefitsCost
相当于根本没有设置任何值,它看到的是 - 用户没有设置值并且该列定义了默认值.因此,在生成的 SQL 中不包括该列。对于缺少的列,应该插入配置的默认值。
作为解决方案,您可以将 BenefitsCost
设为可空类型(十进制?)。这样,如果您设置值 0
,EF 将知道您已经明确设置了一个值。此外,在您的配置中,您必须将默认值标记为 decimal
,例如 1000m
、500m
等
对于Modifier
,和其他一样在OnModelCreating
中配置默认值。根据我的经验,使用 [DefaultValue()]
属性设置默认值不起作用。您甚至不会在迁移脚本中找到默认值的提及。可能是一个错误,但我不确定。