SQLite C#中按表名引用表及动态命名表的database.Insert操作实现方案
解决动态每日表名的ORM创建与插入问题
看起来你想用ORM(从代码风格判断大概率是SQLite-net)实现每日创建不同表名的Food表,并且用ORM的Insert方法插入数据——这其实可以通过动态修改实体映射或者利用ORM框架的重载方法来实现,下面是具体步骤:
首先要注意一个关键点:SQL表名不能包含/这类特殊字符,所以建议把日期格式换成yyyyMMdd这种无特殊符号的形式,比如生成Foods_20220127这样的合法表名。
1. 生成合法的每日表名
先写个简单的逻辑生成每日唯一的表名:
var dailyTableName = $"Foods_{DateTime.Now:yyyyMMdd}";
2. 用ORM方式动态创建表
如果用的是SQLite-net,我们可以修改实体的映射配置来指定动态表名,然后创建表:
// 获取Food实体的映射配置 var foodTableMapping = database.GetMapping<Food>(); // 将映射的表名替换为我们动态生成的名字 foodTableMapping.TableName = dailyTableName; // 创建对应表 database.CreateTable(foodTableMapping);
这种方式完全依托ORM的表映射机制,比直接写CREATE TABLE SQL更贴合你原本的用法。
3. 用ORM的Insert方法插入数据到动态表
幸运的是,SQLite-net的Insert方法有直接指定表名的重载,你只需要在插入时传入动态生成的表名即可:
// 构造要插入的Food对象 var sampleFood = new Food { Name = "Grilled Chicken", Weight = "200g" }; // 插入到动态命名的表中 database.Insert(sampleFood, dailyTableName);
额外提示
- 如果你的ORM框架不支持指定表名的Insert重载,也可以考虑手动构造Insert语句,但优先推荐用框架提供的动态映射能力,避免手写SQL的维护成本。
- 建议把日期格式固定为
yyyyMMdd或者yyyy_MM_dd,避免因为区域设置导致日期格式变化,生成不合法的表名。
内容的提问来源于stack exchange,提问作者Igor Krupskiy




