如何将超过24小时的TimeSpan映射到SQL Server Code First?

Gra*_*ler 40 sql-server entity-framework code-first ef-code-first

我试图将TimeSpan Code First属性映射到SQL服务器.Code First似乎在SQL中将其创建为Time(7).但是.Net中的TimeSpan可以处理超过24小时的更长时间,并且我需要存储超过24小时的事件长度.使用Code First处理此问题的最佳方法是什么?

Gra*_*ler 35

按我刚才的问题上如何时间跨度存储在SQL我被告知将其存储为秒或门票等到底,因为在SQL服务器中没有等效我没时间跨度列映射.我只是创建了一个第二个字段,它将TimeSpan转换为刻度并将其存储在数据库中.然后我阻止了存储TimeSpan

public Int64 ValidityPeriodTicks { get; set; }

[NotMapped]
public TimeSpan ValidityPeriod
{
    get { return TimeSpan.FromTicks(ValidityPeriodTicks); }
    set { ValidityPeriodTicks = value.Ticks; }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望在EF Core中执行此操作,则可以使用" 价值转换",因为它更加清晰.在2.1中,您可以使用值转换和TimeSpanToTicksConverter透明地将时间跨度映射到数据库中的滴答.所以当然值得考虑EF Core(假设其他功能满足需求) - 可以在Framework 4.7项目中使用它,因此不需要切换到.Net Core.

  • 使用扩展方法来获取或设置值,并且应该减少误解. (4认同)
  • 根据StanislawSwierc的评论,如何:而不是NotMapped属性,创建一个"GetValidityPeriod():TimeSpan"方法和一个"SetValidityPeriod(period:TimeSpan):void"方法.这样,它显然是未映射的,显而易见的是它不应该在Linq查询中使用. (3认同)
  • 当有人不知道或忘记ValidityPeriod是NotMapped属性时,这种方法可能导致次优查询.如果它在查询EF不会抱怨的LINQ中使用,它只会拉取集合并迭代它.出于这个原因,可以使用旧式Get/Set访问器来明确它们不应该在查询中使用. (2认同)