猿问

Dapper 将我的日期转换为 01-Jan-01,我不明白为什么?

我正在使用 SQL Server 2012 和 Dapper v1.50.5。


我有一个标准查询:


SELECT * 

FROM [TsData].[ImportingLogs] 

WHERE ImportContextGuid = '{3c19d706-0895-49e4-b96c-38eb6a3cc579}'

它返回一些数据:

并且CreationTime我感兴趣的列具有有效的日期时间。

该表简单定义为:

http://img2.mukewang.com/62aedd5b0001290004030199.jpg

POCO 是:


public class OzCsImportingLogsTableModel

{

    public DateTime CreationDateTime { get; set; }

    public int? CreatorUserId { get; set; }

    public int? DeleterUserId { get; set; }

    public DateTime DeletionTime { get; set; }

    public int DurationMs { get; set; }

    public int Id { get; set; }

    public Guid ImportContextGuid { get; set; }

    public bool IsDeleted { get; set; }

    public DateTime? LastModificationTime { get; set; }

    public int? LastModifierUserId { get; set; }

    public string Message { get; set; }

    public OzCsImportManagerMessageKindEnum MessageKindId { get; set; }

    public string Source { get; set; }

    public string StructuredData { get; set; }

    public string Tags { get; set; }

}

Dapper 的调用是:


DbContext.Execute($"[{Schema}].[usp_ImportingQueue_FinaliseImport]", storedProcParams, aCommandType: CommandType.StoredProcedure)

但是,当我查看时OzCsImportingLogsTableModel.CreationTime,该值始终01-Jan-01 00:00:00为 NULL,这表明该值为 NULL。


我不明白这一点。有人可以在这里指出我正确的方向吗?


绝地无双
浏览 211回答 1
1回答

温温酱

属性的名称(此处CreationDateTime)通常必须与列的名称(此处)匹配CreationTime。话虽如此,它实际上并不是表列的名称,而是结果列的名称,因此您可以执行以下操作:SELECT CreationTime as CreationDateTime, ...如果您可以修改实际查询。正如@fstam 评论的那样:行为是 01-jan-01 是 DateTime 的默认值,并且由于它是不可为空的类型并且从未被 dapper 设置为任何内容,因此它是显示的值。请注意,用于查找列名称成员的逻辑可在此处获得:// 优先顺序是:精确匹配优于下划线匹配,精确大小写优于错误大小写,支持字段优于常规字段,match-inc-underscores 优于 match-exc-underscores但是,在您的情况下,以上均不适用;最好在代码中调整属性的名称。更新:我刚刚看到的另一件事:DurationMs架构中的列可以为空,但DurationMs属性不是。您可能希望将此属性定义为public int? DurationMs { get; set; }。(我没有检查所有成员)。
随时随地看视频慕课网APP
我要回答