MAUI SQLite-net datetime列默认值失效问题技术求助
MAUI SQLite-net DateTime列默认值失效问题
问题现象
- 建表时给
user_created字段设置DATETIME类型和默认值(CURRENT_TIMESTAMP或datetime('now','localtime')),但插入数据后该字段始终显示{1/1/0001 12:00:00 am} - 两种插入方式都没效果:
- 原生SQL插入:
db.Execute("insert into User default values"); - ORM方法插入:
db.Insert(user);
- 原生SQL插入:
- 手动给
user_created赋值后调用db.Update()能正常更新时间,但用原生SQL更新(比如set user_created=CURRENT_TIMESTAMP)同样不生效 - 测试环境:Windows 11 + Android模拟器
原因分析
- ORM字段覆盖:使用
db.Insert(user)时,如果实体的user_created属性是默认的DateTime.MinValue,SQLite-net会生成包含该字段的插入语句,显式插入默认值,直接跳过数据库的默认值约束。 - 类型转换问题:SQLite的
CURRENT_TIMESTAMP返回ISO8601格式字符串,SQLite-net默认的DateTime解析逻辑可能无法正确识别,导致解析失败返回DateTime.MinValue。
解决方案
1. 给实体属性加[Default]特性
在实体类的user_created属性上添加特性,让ORM在属性为默认值时跳过该字段,触发数据库默认值:
public class User { [PrimaryKey, AutoIncrement] public int user_id { get; set; } [Default(typeof(DateTime), "CURRENT_TIMESTAMP")] public DateTime user_created { get; set; } // 其他字段... }
插入时不用给user_created赋值,ORM会自动生成不含该字段的SQL,让数据库用默认值填充。
2. 配置DateTime解析规则
调整SQLite-net的DateTime处理模式,确保能正确解析SQLite返回的时间字符串:
var db = new SQLiteConnection(dbPath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create); // 设置DateTime处理为UTC模式,适配SQLite的时间格式 db.DateTimeKind = DateTimeKind.Utc;
3. 原生SQL操作后重新查询
如果必须用原生SQL插入/更新,操作后重新查询实体,获取数据库中实际存储的时间:
// 插入后查询最新数据 db.Execute("insert into User default values"); var latestUser = db.Table<User>().OrderByDescending(u => u.user_id).First(); // 更新后重新查询目标实体 db.Execute("update User set user_created=CURRENT_TIMESTAMP where user_id=1"); var updatedUser = db.Table<User>().First(u => u.user_id == 1);
4. 改用TEXT类型存储时间(备选)
把数据库字段类型改成TEXT,默认值保留CURRENT_TIMESTAMP,SQLite存储的字符串时间能被SQLite-net稳定解析:
CREATE TABLE User ( user_id INTEGER PRIMARY KEY AUTOINCREMENT, user_created TEXT DEFAULT CURRENT_TIMESTAMP, -- 其他字段... );
内容的提问来源于stack exchange,提问作者WWW
相关产品推荐
相关产品推荐

