如何使用Dapper+Dommel+FluentMap向无主键表插入记录
Dommel 提供的默认 InsertAsync 方法在设计上依赖实体的键属性配置,因为插入完成后会默认尝试读取数据库生成的键值回写到实体对象中,所以当实体没有配置任何键属性时就会抛出你遇到的 Could not find the key properties 异常。
下面是两种完全基于 Dommel 生态的解决方案,不需要手写SQL:
方案1:修改Fluent映射配置(推荐)
因为你已经在使用FluentMap做实体映射,只需要给无主键表对应的实体手动指定键(如果你的表是靠两个字段联合保证唯一,直接配置复合键即可),同时标记键不由数据库生成:
public class MyTableMap : DommelEntityMap<MyTable> { public MyTableMap() { // 替换为你实际的表名 ToTable("MyTable"); // 将两个字段配置为复合键,且标记为非数据库生成,跳过自增主键回写逻辑 Map(x => x.SomeProperty).IsKey().IsNotGenerated(); Map(x => x.AnotherProperty).IsKey().IsNotGenerated(); } }
配置完成后直接调用原有 InsertAsync 方法即可正常执行插入,Dommel 会生成符合预期的 INSERT 语句,不会再做键检测报错。
方案2:使用InsertBulkAsync方法(无需修改映射)
Dommel 提供的批量插入方法 InsertBulkAsync 本身不需要检测实体键,也不会做插入后的主键回写逻辑,哪怕你只需要插入单条数据,也可以把实体包装成集合传入该方法:
var newRecord = new MyTable { SomeProperty = 123, AnotherProperty = 456 }; // 传入仅包含单条记录的集合即可完成插入 await connection.InsertBulkAsync(new[] { newRecord });
这个方案适合不想调整现有映射配置的场景,缺点是方法没有返回值,无法拿到插入后的生成值(你的场景本身没有主键,完全不受影响)。
内容的提问来源于stack exchange,提问作者tfidelis
相关产品推荐
相关产品推荐

