Dapper正在将我的日期转换为01年1月1日,我不知道为什么吗?

时间:2018-12-20 04:47:54

标签: c# .net dapper

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

我有一个标准查询:

SELECT * 
FROM [TsData].[ImportingLogs] 
WHERE ImportContextGuid = '{3c19d706-0895-49e4-b96c-38eb6a3cc579}'

返回一些数据:

enter image description here

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

该表的简单定义为:

enter image description here

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。

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

1 个答案:

答案 0 :(得分:0)

@John的评论正确。属性的名称(此处为CreationDateTime)通常必须与列的名称(此处为CreationTime)匹配。话虽如此,它实际上不是表列的名称,而是结果列的名称,因此您可以执行以下操作:

SELECT CreationTime as CreationDateTime, ...

如果您可以修改实际查询。

正如@fstam所评论的:行为是01-jan-01是DateTime的默认值,并且由于它是不可为null的类型,并且从来没有被dapper设置为任何值,所以它是显示的值。

请注意,here可用用于查找列名成员的逻辑:

  

//偏好顺序为:   下划线完全匹配,完全匹配   大小写错误,后备字段超过常规字段,   match-inc-下划线要比match-exc下划线

对于您而言,以上都不适用;最好在代码中调整属性的名称。

更新:

我刚刚看到的另一件事:模式中的DurationMs列可以为空,而DurationMs属性却不能为空。您可能要定义 将此属性改为public int? DurationMs { get; set; }。 (我尚未检查所有成员)。