簡體   English   中英

EntityFramework Core 2默認值

[英]EntityFramework Core 2 Default Values

我正在嘗試在幾個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”的“狀態”列中; 列不允許為空。 INSERT失敗。

就像我在保存對象之前檢查對象一樣,它具有默認值,但是卻出現此異常,這令人困惑。 我知道最簡單的解決方案是僅在創建對象時確保設置狀態值,但這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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM