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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:48:47