使用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()");
    ......
}

 

posted @ 2019-07-27 10:24  jqdy  阅读(989)  评论(0编辑  收藏  举报