为啥我从 Dapper 返回的对象具有 null 和默认属性值?

Posted

技术标签:

【中文标题】为啥我从 Dapper 返回的对象具有 null 和默认属性值?【英文标题】:Why do my objects returned from Dapper have null and default property values?为什么我从 Dapper 返回的对象具有 null 和默认属性值? 【发布时间】:2013-09-17 06:25:53 【问题描述】:

我在存储库中使用 Dapper 将查询结果映射到 DTO 类型列表以供我的 API 返回。一切似乎都正常,但查询和映射完成后,列表中填充了正确数量的对象,但所有 int 属性均为 0,字符串为空。我在其他项目中使用过不少 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")]。仍然没有运气。我忽略了什么?

编辑: 我能够使用 related answer 中的示例代码和要点解决此问题。

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢,但这也没用。我在帖子底部提到我包含了 [Column(Name = "Id")],我认为这是我的自定义地图的正确格式。如果字段名称匹配,这样的地图属性不是可选的吗?但是 - 我确实尝试完全删除自定义映射并且这次它起作用了(因为在这种情况下列名匹配)所以这显然是我的问题所在。但我需要弄清楚如何让地图适用于其他不匹配的列。 好的,我做了更多的研究,发现this answer 有一个解决如何做到这一点的要点。看起来我从某个地方得到了他答案的第一部分,但需要剩下的部分。感谢您的帮助。

以上是关于为啥我从 Dapper 返回的对象具有 null 和默认属性值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 dapper 在进行选择时为 Guid 返回全零但表中的 guid 值设置正确?

如何从 Dapper 查询返回 null 而不是 default(T)?

为啥 SocketAsyncEventArgs.RemoteEndpoint 返回 null? C#

为啥坐标对象的标题属性在移动 safari 中总是返回 null?

为啥 Spring 安全身份验证返回 Null 身份验证对象?

Dapper - 如何将记录作为自定义对象类型返回?