zoukankan      html  css  js  c++  java
  • 使用EF Code First生成模型,如何让时间字段由数据库自动生成

    1. 场景:保存记录时需要时间字段,该时间如果由前台通过DateTime.Now产生,存在风险,比如修改客户端的系统时间,就会伪造该记录的生成时间。因此,需要在保存记录时,由后台自动赋予具体的时间。
    2. 实现方法:

    1)完成模型

    public class Record
    {
        .....//其他字段
        public DateTime Date{get;set;}
    }

    2) 使用add-migration

    3) 在VS生成的Migration文件中修改该字段

    修改前:

    namespace ***.Migrations
    {
        public partial class Init : Migration
        {
            protected override void Up(MigrationBuilder migrationBuilder)
            {
                ......//其他表的信息
                migrationBuilder.CreateTable(
                    name: "Records",
                    columns: table => new
                    {
                        ......//其他字段的信息
                        Date = table.Column<DateTime>(nullable: false),
                        ......//其他字段的信息
                     });
                ......//其他表的信息
            }
            ......    
        }
    }

    修改后(涂黄部分):

    namespace ***.Migrations
    {
        public partial class Init : Migration
        {
            protected override void Up(MigrationBuilder migrationBuilder)
            {
                ......//其他表的信息
                migrationBuilder.CreateTable(
                    name: "Records",
                    columns: table => new
                    {
                        ......//其他字段的信息
                        Date = table.Column<DateTime>(nullable: false, defaultValueSql:"GETDATE()"),
                        ......//其他字段的信息
                     });
                ......//其他表的信息
            }
            ......    
        }
    }

    4)使用update-database完成迁移

    5)程序中涉及到该时间时,可以不用理会,context.SaveChanges()时,在数据库中可以自动生成保存的时间。即便使用Date = DateTime.Now给该字段添加了时间,保存时该时间也会被忽略。

    另外,在 OnModelCreating中使用相关配置,也可直接生成defaultValueSql,不用在Migration中手动修改,如下:

     protected override void OnModelCreating(ModelBuilder builder)
    {    
        ......
        builder.Entity<Record>().Property("Date").HasDefaultValueSql("GETDATE()");
        ......
    }
  • 相关阅读:
    Python subprocess- call、check_call、check_output
    Java Annotation认知(包括框架图、详细介绍、示例说明) (转)
    NVME SSD vs SATA SSD(转)
    scala中“_”的用法
    maven scope 'provided' 和 ‘compile’的区别
    scala tuple中的syntactic sugar
    Scala中的"null" 和“_”来初始化对象
    scala可变长度参数(转)
    Java中的Builder模式
    Scala中“=>”用法及含义
  • 原文地址:https://www.cnblogs.com/jqdy/p/11254065.html
Copyright © 2011-2022 走看看