我正在尝试将TimeSpan Code First属性映射到SQL Server。 Code First似乎在SQL中将其创建为Time(7)。但是.Net中的TimeSpan可以处理比24小时更长的时间,我需要存储超过24小时的事件长度。使用Code First处理此问题的最佳方法是什么。
答案 0 :(得分:34)
根据我的previous question关于如何在SQL中存储TimeSpan,我被建议将其存储为秒或票据等。最后,我没有映射TimeSpan列,因为SQL服务器中没有等效项。我只是创建了一个第二个字段,它将TimeSpan转换为刻度并将其存储在数据库中。然后我阻止了存储TimeSpan
public Int64 ValidityPeriodTicks { get; set; }
[NotMapped]
public TimeSpan ValidityPeriod
{
get { return TimeSpan.FromTicks(ValidityPeriodTicks); }
set { ValidityPeriodTicks = value.Ticks; }
}
如果您希望在EF Core中执行此操作,那么使用Value Conversions会更加清晰。在2.1中,您可以使用值转换和TimeSpanToTicksConverter透明地将时间跨度映射到数据库中的滴答。所以当然值得考虑EF Core(假设其他功能满足需求) - 可以在Framework 4.7项目中使用它,所以不需要切换到.Net Core。
答案 1 :(得分:3)
据我所知,SQL Server for .NET的TimeSpan中没有等效的数据类型。最接近的匹配是时间,但是,正如您所指出的,它只支持长达24小时的值? http://msdn.microsoft.com/en-us/library/ms186724.aspx#DateandTimeDataTypes。
以下MSDN文档描述了此http://msdn.microsoft.com/en-us/library/bb386909.aspx。我假设因为那里没有列出解决方案,所以目前无法实现。
答案 2 :(得分:1)
首先,MVC与此问题无关。它与EF Code First和SQL Server完全相关,因此它是DAL问题。
一种解决方案可能是在您的实体配置中提供自定义列类型,如下所示:
modelBuilder
.Entity<MyClass>()
.Property(c => c.MyTimeSpan)
.HasColumnType("whatever sql type you want to use");