使用FreeSQL走过的坑
FreeSQL还挺好用的,后续的新项目,用到数据库的,基本上都改用FreeSQL了。但是在FreeSQL的过程中,不可避免地踩过一些坑,分享出来供大家参考。
1、慎用UseAutoSyncStructure(true)功能,特别是一些老项目改造,和数据非常重要的项目。
UseAutoSyncStructure功能非常方便,FreeSQL会根据定义的数据类,自动生成数据库表和数据库字段。但使用不当,可能会造成数据丢失。
我之前踩过的坑是改成自己写的日志软件时遇到的,因为我的日志内容部分比较长,所有原来用的数据库字段类型是LongText,代码中数据类的字段类型是string。改造过程没去特别定义字段长度。出现的结果是,在MySQL数据库中,FreeSQL默认会把数据类型是string的字段,定义成类似长度256的varchar类型。然后FreeSQL把我原来的LongText类型直接改成了varchar(256),把原来日志内容超出的部分全删除了。相当于我前面写的所有的日志内容都只剩下256个字符了,欲哭无泪。
解决办法:
1)不要开启UseAutoSyncStructure自动迁移功能
freeSql = new FreeSql.FreeSqlBuilder() .UseConnectionString(type, connectionString) .UseLazyLoading(true) .UseMonitorCommand(cmd => Debug.WriteLine(cmd.CommandText)) //.UseAutoSyncStructure(true) .Build();
2)文本内容超长的字段,要定义一下字段长度,我一般直接把StringLength定义成-2,相当于就是LongText
[Column(IsNullable = false, StringLength = -2)] public string TaskContent { get; set; }
2、不同数据库切换时要小心。
FreeSQL封装得比较好,可以非常方便地匹配不同的数据库类型,所以我现在的小工具基本上都会同地支持MySQL和SQLite,同时支持切换数据库。
前面我弄的小工具ToDoManager,默认使用SQLite,但我平常都是使用MySQL。有一次,在调试过程中,在软件运行过程中,把数据库从SQLite切换到MySQL,但切换完以后没有从新数据库中重新加载数据。然后这个小工具,前面为了方便加了退出时自动保存的功能。导致的后果是,SQLite的空数据把MySQL里的有效数据全替换了,导致我MySQL里的数据基本上全丢了。