EntityFramework Core 2默认值

时间:2018-01-26 11:51:56

标签: c# entity-framework entity-framework-core

我正在尝试在我的几个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插入“State”表中   'app.dbo.packages';列不允许空值。   INSERT失败。

这很令人困惑,好像我在保存之前检查了对象,它有一个默认值,但我得到了这个异常。我理解最简单的解决方案是简单地确保在创建对象时设置state的值,但这种方法违背了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,
}

2 个答案:

答案 0 :(得分:2)

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

还找到.HasDefaultValueSql("getdate()").HasDefaultValue(3); here

答案 1 :(得分:1)

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

的代码