You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改SQL Server表列后RepoDB的Merge操作结果异常如何解决

你遇到的问题是RepoDB默认的表架构元数据缓存机制导致的。RepoDB首次操作某张表时,会将表的列定义、字段类型/长度等元数据缓存到内存中,后续对该表的操作会直接读取缓存,不会重新查询数据库的实际表结构,所以ALTER表之后的变更没有被识别到:旧缓存中Data字段长度还是nvarchar(1),所以Long_word被截断为Lo,旧缓存中不存在Name列,所以直接赋值为NULL。

解决方法

RepoDB提供了主动清理缓存的方法,你在修改表结构之后调用对应方法刷新缓存即可:

  • 清理单张表的缓存:调用DbMapper.Flush("example"),参数为你的表名
  • 如果需要清理所有表的缓存,可以调用DbMapper.Flush()不传入任何参数

修改后的可正常运行的代码示例:

SqlServerBootstrap.Initialize();
using (var cnt = new SqlConnection(connectionString))
{
    cnt.ExecuteNonQuery("DROP TABLE IF EXISTS example");
    cnt.ExecuteNonQuery("CREATE TABLE example(Id int NOT NULL PRIMARY KEY, Data nvarchar(1));");
    cnt.Merge("example", new { Id = 1, Data = "a" });  //新增一行数据
    cnt.ExecuteNonQuery("ALTER TABLE example ALTER COLUMN Data nvarchar(10);\n ALTER TABLE example ADD Name nvarchar(10);");
    // 新增:清理example表的缓存,强制RepoDB下次操作时重新读取表结构
    DbMapper.Flush("example");
    cnt.Merge("example", new { Id = 1, Data = "Long_word", Name = "A_name" });  //更新同一行数据
};

如果你的场景是运行时会频繁修改表结构,也可以在初始化时调整全局缓存配置,但该操作会大幅降低数据库操作性能,非必要不推荐,按需清理对应表的缓存是性价比最高的方案。

内容的提问来源于stack exchange,提问作者Kenneth Bo Christensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:57:03