• 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 更多了一份魅力。 

  • 相关阅读:
    docker-compose.yml容器网络
    docker-compose搭建redis集群
    docker-compose简易搭建rabbitmq
    docker仓库快速搭建
    CNN是怎样一步步工作的?
    全连接层分类的原理
    vector中erase()与insert()用法
    MySQL安装教程
    红黑树与AVL树比较
    C++内存管理(超长,例子很详细,排版很好)
  • 原文地址:https://www.cnblogs.com/dudu/p/6740170.html
Copyright © 2020-2023  润新知