FreeSql
FreeSql copied to clipboard
Sqlite的CodeFirst模式中DateTime类型与DataGrip的兼容性问题
问题描述及重现代码:
由于Sqlite中并没有DateTime类型,是使用其他类型模拟的。而目前Freesql的CodeFrist模式好像是给Sqlite一个DATETIME类型。 这种不存在的类型好像在不同的IDE中处理方式不同。 在sqlite studio中应该是作为TEXT处理的,freesql读取正常。 在DataGrip(包括Rider自带的)中是处理为INT了,会给一个时间戳,这个时间戳在freesql里读取会报错。
数据库版本
sqlite3
安装的Nuget包
最新的
.net framework/. net core? 及具体版本
.net8
如果是 时间戳 可以映射成 int
定义多一个 Ignore DateTime 属性
我现在用的是BaseEntity,里面的CreateTime和UpdateTime是必输项。如果用Rider自带的数据库管理工具来处理,是没法新增数据的。因为这两个栏位必须输入,但是DataGrip会转成时间戳。Freesql读取的时候就报错。
我的意思是既然Sqlite并没有真正的DateTime类型,而Freesql又只认TEXT转换的DateTime,那是否可以在Sqlite建表的时候直接把DateTime映射成TEXT类型而不是DATETIME类型?这样就能解决不一致的问题了。
鞠佬,抓到你了
只是针对建表,可以这样统一处理:
fsql.Aop.ConfigEntityProperty += (_, e) =>
{
if (e.Property.PropertyType == typeof(DateTime))
{
e.ModifyResult.Attribute.DbType = "TEXT";
}
};
这样也可以,但是每个项目都需要搞这一下,在Sqlite中把类型映射成并不存在的DATETIME是有什么特殊用意吗?
因为改动会影响老玩家升级,解释成本巨高
老玩家应该没有任何感知才对,这里的DATETIME类型Sqlite是不认的,大部分IDE就是当作了TEXT,我试过直接在数据库里改成TEXT,程序读取也是完全没有问题的。应该也就是建表语句稍微有点差别,建表完成以后应用应该是完全无感知的