实体框架核心 2 默认值



我正在尝试在我的几个 EF 模型上使用默认值,我注意到要么我误解了HasDefaultValue行为,要么它没有正常工作。

我有以下表格和支持模型

CREATE TABLE [dbo].[packages]
(
[Scnumber] BIGINT NOT NULL, 
[PU] INT NOT NULL,
[State] SMALLINT NOT NULL DEFAULT 0, 
[Status] [smallint] NOT NULL, 
[Created] DATETIME NOT NULL DEFAULT GETDATE(), 
CONSTRAINT [PK_packages] PRIMARY KEY CLUSTERED ([Scnumber] ASC) ON [PRIMARY], 
)
[Table("packages", Schema = "dbo")]
public class Package
{
[Key]
[Column(TypeName = "bigint")]
public long Scnumber { get; set; }
[Column]
[Required]
public int PU { get; set; }
[Column(TypeName = "smallint")]
[Required]
public PackageStatus Status { get; set; }
[Column(TypeName = "tinyint")]
public RecordState State { get; set; }
[Column]
public DateTime? Created { get; set; }    
}

为了应用默认值,我的OnModelCreating()中也有以下内容

modelBuilder.Entity<Package>(entity =>
{
entity.Property(r => r.State)
.HasDefaultValue(RecordState.Active);
entity.Property(r => r.Created)
.HasDefaultValue(DateTime.Now);
});

当我尝试保存新对象时,出现以下异常:

Sql异常:无法将值 NULL 插入到"状态"列、表中 'app.dbo.packages';列不允许空值。 插入失败。

这很令人困惑,就好像我在保存对象之前检查对象一样,它有一个默认值,但我得到了这个异常。我知道最简单的解决方案是简单地确保我在创建对象时设置状态值,但这违背了HasDefaultValue的目的。

--编辑--

当我尝试添加新对象时,我执行以下操作

var package = new Package { Scnumber = 0123456718, PU = 1001 };
_context.Packages.Add(region);
_context.SaveChanges();

没有什么是异常的,但失败了,但是如果我运行以下内容,它可以工作

var package = new Package {Scnumber = 0123456718, PU = 1001, Status = PackageStatus.Rejected, State = RecordState.Staging, Created = DateTime.Now };
_context.Packages.Add(region);
_context.SaveChanges();
public enum PackageStatus : short
{
New,
PendingValidation,
CheckedOut,
Approved,
Rejected,
PendingRender,
Rendered,
RenderFailed,
PendingPrint,
Printed,
PrintFailed,
Cancelled,
PendingDownload,
Downloaded,
DownloadError,
SystemUpdated, 
}
public enum RecordState : byte
{
Active,
Deleted,
Staging,
}

我有一个.HasDefaultValueSql("((0))")在我当前的项目中工作。

在这里也发现了.HasDefaultValueSql("getdate()").HasDefaultValue(3);

我遇到了同样的问题。OnModelCreating更新后 您必须应用迁移到数据库。写dotnet ef migrations add defaultValuesAddedToPackage,然后dotnet ef database update.这会在列类型上生成默认值,因此无需在新实体或 sql 插入中显式设置。如果你写dotnet ef migrations script你会看到类似ALTER TABLE [packages] ADD DEFAULT 0 FOR [State];

最新更新