FreeSql icon indicating copy to clipboard operation
FreeSql copied to clipboard

Sqlite的CodeFirst模式中DateTime类型与DataGrip的兼容性问题

Open j4587698 opened this issue 1 year ago • 7 comments

问题描述及重现代码:

由于Sqlite中并没有DateTime类型,是使用其他类型模拟的。而目前Freesql的CodeFrist模式好像是给Sqlite一个DATETIME类型。 这种不存在的类型好像在不同的IDE中处理方式不同。 在sqlite studio中应该是作为TEXT处理的,freesql读取正常。 在DataGrip(包括Rider自带的)中是处理为INT了,会给一个时间戳,这个时间戳在freesql里读取会报错。

数据库版本

sqlite3

安装的Nuget包

最新的

.net framework/. net core? 及具体版本

.net8

j4587698 avatar Jan 16 '24 00:01 j4587698

如果是 时间戳 可以映射成 int

定义多一个 Ignore DateTime 属性

2881099 avatar Jan 16 '24 11:01 2881099

我现在用的是BaseEntity,里面的CreateTime和UpdateTime是必输项。如果用Rider自带的数据库管理工具来处理,是没法新增数据的。因为这两个栏位必须输入,但是DataGrip会转成时间戳。Freesql读取的时候就报错。

我的意思是既然Sqlite并没有真正的DateTime类型,而Freesql又只认TEXT转换的DateTime,那是否可以在Sqlite建表的时候直接把DateTime映射成TEXT类型而不是DATETIME类型?这样就能解决不一致的问题了。

j4587698 avatar Jan 17 '24 00:01 j4587698

鞠佬,抓到你了

densen2014 avatar Jan 17 '24 04:01 densen2014

只是针对建表,可以这样统一处理:

fsql.Aop.ConfigEntityProperty += (_, e) =>
{
    if (e.Property.PropertyType == typeof(DateTime))
    {
        e.ModifyResult.Attribute.DbType = "TEXT";
    }
};

2881099 avatar Jan 17 '24 11:01 2881099

这样也可以,但是每个项目都需要搞这一下,在Sqlite中把类型映射成并不存在的DATETIME是有什么特殊用意吗?

j4587698 avatar Jan 17 '24 12:01 j4587698

因为改动会影响老玩家升级,解释成本巨高

2881099 avatar Jan 17 '24 12:01 2881099

老玩家应该没有任何感知才对,这里的DATETIME类型Sqlite是不认的,大部分IDE就是当作了TEXT,我试过直接在数据库里改成TEXT,程序读取也是完全没有问题的。应该也就是建表语句稍微有点差别,建表完成以后应用应该是完全无感知的

j4587698 avatar Jan 17 '24 13:01 j4587698