为什么从 Dapper 返回的对象具有 null 和默认属性值

本文关键字:null 默认 属性 Dapper 返回 对象 为什么 | 更新日期: 2023-09-27 18:31:46

我在存储库中使用 Dapper 将查询结果映射到 DTO 类型的列表,以便我的 API 返回。一切似乎都正常工作,但在查询和映射完成后,列表中填充了正确数量的对象,但所有 int 属性均为 0,字符串为 null。我在其他项目中使用过Dapper很多次,以前从未遇到过这种情况。我还验证了数据是否正确,如果我将查询复制到 SQL Management Studio,它会为我提供正确的数据。

下面是包含自定义映射逻辑的存储库基类的构造函数。我确认此代码被击中。

static BaseRepository()
{
    SqlMapper.SetTypeMap(typeof(T),
      new CustomPropertyTypeMap(
          typeof(T), (type, columnName) => type.GetProperties()
              .FirstOrDefault(prop => prop.GetCustomAttributes(false)
                      .OfType<ColumnAttribute>()
                      .Any(attr => attr.Name == columnName))));
}

以下是填充列表的存储库方法:

public IEnumerable<Dog> GetAll()
{
    var dogs = Db.Query<Dog>(@"SELECT Id, Name FROM Dogs");
    return dogs;
}

这是我的对象:

[DataContract]
public class Dog
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string Name { get; set; }
}

所以我确认了"dogs"变量被填充,但所有 Id 和 Name 元素都是 0 或 null。最终的 JSON 结果如下所示:

[
    {
        Id: 0,
        Name: null
    },
    {
        Id: 0,
        Name: null
    },
    {
        Id: 0,
        Name: null
    }
]

我还尝试向属性添加列属性,例如 [Column(Name = "Id")] .还是没有运气。我忽略了什么?

编辑:我能够使用这个相关答案中的示例代码和要点来解决此问题。

为什么从 Dapper 返回的对象具有 null 和默认属性值

您似乎有一个自定义地图,该地图使用[Column("Id")]等来定义/识别列。但是,您尚未添加此属性 - 因此不会找到任何列...