文章出處

對于用于保存記錄添加時間的數據庫日期字段,我們通常會設置一個 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 更多了一份魅力。 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()