不确定这是否是已知问题。但是,似乎如果StatusId int属性的显式值为0,则将新实体插入数据库时,将忽略此值,而使用数据库默认值1。
我已读过这篇文章,可能是由于忽略了CLR类型的默认值,因此对于int而言,将忽略0值,因此它使用数据库默认值。
更新实体似乎不受影响。
我不想将我的实体属性更改为int吗?因为它总是有价值的。
此问题是否已解决?
我的实体如下:
public class FuelGroup
{
public int Id { get; set; }
public string ConcurrencyStamp { get; set; }
public string Description { get; set; }
public string ShortDesc { get; set; }
public int StatusId { get; set; }
}
public enum StatusEnums
{
Inactive = 0,
Active = 1,
Other = 2
}
public class DataContext : DbContext, IDataContext
{
private const string SQL_NEWID_FUNCTION = "(newid())";
public DataContext(DbContextOptions<DataContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<FuelGroup>(ConfigureFuelGroup);
}
private void ConfigureFuelGroup(EntityTypeBuilder<FuelGroup> builder)
{
builder.Property(p => p.Id)
.IsRequired()
.ValueGeneratedOnAdd()
.UseSqlServerIdentityColumn();
builder.HasKey(p => p.Id);
builder.Property(e => e.ConcurrencyStamp)
.IsRequired()
.HasDefaultValueSql(SQL_NEWID_FUNCTION);
builder.Property(p => p.Description)
.HasMaxLength(FuelGroupValidators.DescriptionMaxLength)
.IsRequired();
builder.Property(p => p.ShortDesc)
.HasMaxLength(FuelGroupValidators.ShortDescMaxLength)
.IsRequired();
builder.Property(p => p.StatusId)
.IsRequired()
.HasDefaultValue((int)StatusEnums.Active);
}
}
CREATE TABLE [FuelGroups] (
[Id] [int] IDENTITY(1,1) NOT NULL,
[ConcurrencyStamp] [nvarchar](max) NOT NULL DEFAULT (NEWID()),
[Description] [nvarchar](256) NOT NULL,
[ShortDesc] [nvarchar](10) NOT NULL,
[StatusId] [int] NOT NULL DEFAULT(1)
)
更多技术细节
EF核心版本:
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.4" />
数据库提供者:
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.4" />
操作系统:
Windows 7
IDE:
Visual Studio 2019 16.1.2