zoukankan      html  css  js  c++  java
  • 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 更多了一份魅力。 

  • 相关阅读:
    第四周编程总结
    第三周作业编程总结
    第二周基础作业
    【C++学习教程03】面向对象编程的基本知识&内联函数
    【C++学习教程02】运算符
    【C++学习教程01】C++命名空间重名&函数原型&字符类型&数据类型
    为什么匿名内部类只能访问其所在方法中的final变量
    android通过socket上传文件
    android socket编程
    test markdown-here chrome 插件
  • 原文地址:https://www.cnblogs.com/dudu/p/6740170.html
Copyright © 2011-2022 走看看