Entity Framework Core的貼心:優雅處理帶默認值的數據庫字段


對於用於保存記錄添加時間的數據庫日期字段,我們通常會設置一個 GETDATE() 的默認值,而不是在應用程序的代碼中獲取當前時間進行保存,這樣可以避免由於web服務器時鍾不同步引起的時間偏差。

Entity Framework Core 在設計時貼心地考慮到這個場景,提供了 .HasDefaultValueSql() 映射配置,今天在實際開發中體檢了一下,的確管用。

比如下面的數據庫表中 DateAdded 與 IsActive 這2個字段分別設置了默認值:

CREATE TABLE [dbo].[Log](
    [Id] [int] IDENTITY(1,1) NOT NULL,    
    [IP] [varchar](20) NOT NULL,
    [DateAdded] [datetime] NOT NULL DEFAULT (GETDATE()),
    [IsActive] [bit] NOT NULL DEFAULT ((1))
)

使用 EF Core 的 HasDefaultValueSql 進行映射配置:

builder.Entity<Log>().Property(l => l.DateAdded).HasDefaultValueSql(null);
builder.Entity<Log>().Property(l => l.IsActive).HasDefaultValueSql(null);

在 EF Core 2.0 中需要改為:

builder.Entity<Log>().Property(l => l.DateAdded).HasDefaultValue();
builder.Entity<Log>().Property(l => l.IsActive).HasDefaultValue();

在 EF Core 保存數據時會生成下面的SQL語句:

exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [Log] ([IP])
VALUES (@p0);
SELECT [Id], [DateAdded], [IsActive]
FROM [Log]
WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity();

',N'@p0 nvarchar(20)',@p0=N'127.0.0.1'

在 INSERT 時忽略 HasDefaultValueSql 的字段,在 INSERT 后將默認值 SELECT 出來賦給實體對應的屬性。 

貼心的 Entity Framework Core ,讓 .NET Core 更多了一份魅力。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM