我试图在几个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);
});
尝试保存新对象时,出现以下异常:
SqlException:无法将值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);
here。