我正在使用SQL Server 2012和Dapper v1.50.5。
我有一个标准查询:
SELECT *
FROM [TsData].[ImportingLogs]
WHERE ImportContextGuid = '{3c19d706-0895-49e4-b96c-38eb6a3cc579}'
返回一些数据:
和我感兴趣的CreationTime
列具有有效的日期时间。
该表的简单定义为:
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。
我不明白。有人可以在这里指示我正确的方向吗?
答案 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; }
。
(我尚未检查所有成员)。