在处理日期时,我一直在 SQL Server 中使用 DateTime2 类型来存储 C# DateTime。
.NET 6 引入了新的结构,例如 DateOnly 和 TimeOnly。我认为这些应该映射到 Date 和 Time。
是否存在转换无效的特殊情况?这些类型完全兼容吗?
在 SQL Server 中保存时间时,例如 time(7),通过 SqlDataReader 检索列数据,该值将作为 TimeSpan 返回。
这不是等价转换。但是,要转换为 TimeOnly 实例,您可以解析字符串化的 TimeSpan。
TimeOnly.Parse({timespanvalue}.ToString());
不是非常优雅,但在处理 TimeOnly 和 sql server 时间时需要考虑一些事情。
要将时间跨度转换为 TimeOnly,您可以简单地使用 Microsoft 在 TimeOnly 结构上使用静态方法预见的 api :
public static TimeOnly FromTimeSpan (TimeSpan timeSpan);
参考https://learn.microsoft.com/en-us/dotnet/api/system.timeonly.fromtimespan?view=net-8.0
正如您从链接中看到的,这可能仅在 .NET8 中可用
您需要这个的原因是,如果您使用我的 Microsoft 提供的 sqldatareader,它会返回 DateOnly 字段,将 sql server 中的日期映射到 DataTime,而 TimeOnly 字段映射到 sql server 中的时间,但由读取器作为 TimeSpan 返回。要实际获取 dateonly 和 timeonly 字段,您必须使用 DateOnly 和 TimeOnly 上预见的适当 api。
你应该做两件事:
在项目中创建一个文件夹“Converter”和一个“DateOnlyConverter.cs”类,其中包含以下代码
公共类 DateOnlyConverter : ValueConverter
在您的 DbContext 类中粘贴以下代码
受保护的覆盖无效ConfigureConventions(ModelConfigurationBuilder构建器)
{
构建器.Properties()
.HaveConversion()
.HaveColumnType("日期");
}
它对我有用!