Sqlite不支持datetime类型的数据,我们一般用Text或者Numeric来存储这个数据类型,在编程的时候感觉颇为不便,经研究可以通过下面的步骤让它运行日期类型。
- 在使用
Scaffold-DbContext
命令在项目中生成了Sqlite数据库上下文和模型后,对于使用Text数据类型存储日期时间的(使用Numeric的不需要做这一步),在数据库的上下文文件里的OnModelCreating进行改进如下,要点在最后面的6行:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SqliteBlockedIp>(entity =>
{
entity.ToTable("SqliteBlockedIP");
entity.HasIndex(e => e.Id, "Index_ID").IsUnique();
entity.Property(e => e.Id).HasColumnName("ID");
entity.Property(e => e.Ipaddress).HasColumnName("IPAddress");
//added by Darwin Zuo for DateTime conversion专为数据转换而添加
entity.Property(e => e.BlockedTime).HasConversion
(
v => v.ToString("yyyy-MM-dd HH:mm:ss"), // 从DateTime到string的转换
v => DateTime.ParseExact(v, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) // 从string到DateTime的转换
);
});
......
}
- 找到模型文件的对应字段的属性,我这里是BlockedTime,它原来是如下这样的
public string BlockedTime { get; set; } = null!;
或者public byte[]? BlockedTime { get; set; }
把它改成这样:
public DateTime BlockedTime { get; set; } = DateTime.MinValue!;
然后编译程序 ,属性BlockedTime就直接成为DateTime类型了。
注意:以上内容在使用Scaffold-DbContext
刷新上下文和模型后,需要再次添加和修改!!