如何使用Dapper插入关联对象对应的外键ID?
问题原因
@TemplateType.Id的参数写法无法生效,核心是Dapper默认的参数绑定规则只会查找传入对象的一级属性,不会自动递归解析嵌套子对象的属性,因此无法匹配到SQL中需要的TemplateTypeId参数值。
另外你原有SQL定义前加的$字符串插值符是多余的:Dapper原生通过@参数名完成参数绑定,不需要C#侧提前做字符串拼接,保留插值符反而会提升SQL注入风险,直接移除即可。
可行解决方案
以下两种方案都不需要手动逐个配置数十个属性的DynamicParameters,可以根据自己的项目场景选择:
- 方案1:匿名对象平铺传参(改动最小,适合单场景使用)
直接在执行SQL时传入匿名对象,把嵌套的子对象属性平铺为和SQL参数同名的一级属性即可,Dapper会自动完成值映射:
string sql = @"insert into dbo.Template (Title, SignaturePerLine, StandardTime, StartDate, SpecialTest, TemplateTypeId) values (@Title, @SignaturePerLine, @StandardTime, @StartDate, @SpecialTest, @TemplateTypeId);"; connection.Execute(sql, new { Template.Title, Template.SignaturePerLine, Template.StandardTime, Template.StartDate, Template.SpecialTest, TemplateTypeId = Template.TemplateType.Id });
- 方案2:实体类增加同名映射属性(适合多场景复用)
如果这个Template类会在多处增删改查逻辑中用到,直接在类中新增一个和数据库外键字段同名的属性,指向嵌套TemplateType的Id即可,后续所有操作直接传Template对象就能被Dapper正确识别,不需要每次传参都做额外处理:
public class Template { public int Id { get; set; } public string Title { get; set; } public bool SignaturePerLine { get; set; } public string SpecialTest { get; set; } public TemplateType TemplateType { get; set; } = new TemplateType(); // 新增与外键字段同名的属性,映射嵌套类型的Id值 public int TemplateTypeId { get => TemplateType.Id; set => TemplateType.Id = value; } public int StandardTime { get; set; } public DateTime StartDate { get; set; } }
改完实体后,SQL直接使用@TemplateTypeId作为参数,传入完整Template对象即可正常执行插入。
内容的提问来源于stack exchange,提问作者Bandito
相关产品推荐
相关产品推荐

