EF DateTimes不匹配SQL Server中保存的值

本文关键字:保存 Server DateTimes 不匹配 SQL EF | 更新日期: 2023-09-27 17:51:13

我使用c#实体框架保存一个日期时间,当我从数据库加载该时间时,时间与我保存的值相差1毫秒或更多毫秒。

下面是c#代码:

    public List<DateTime> TestDate()
    {
        var dates = new List<DateTime>();
        DateTime testvalue = DateTime.Now;
        dates.Add(testvalue);
        IactexGMG2Entities firstContext = new IactexGMG2Entities();
        var firstQuery = from p in firstContext.LocationProperties
                         where p.locationPropertyId == 4
                         select p;
        var firstRec = firstQuery.Single();
        firstRec.locationPropertyDateTime = testvalue;
        firstContext.SaveChanges();
        firstContext.Dispose();
         IactexGMG2Entities secondContext = new IactexGMG2Entities();
         var secondQuery = from p in secondContext.LocationProperties
                          where p.locationPropertyId == 4
                          select p;
        var secondRec = secondQuery.Single();
        var secondDate = secondRec.locationPropertyDateTime ?? DateTime.Now;
        dates.Add(secondDate);
        secondContext.Dispose();
        return dates;
    }

以下是接收到的值:

5/29/2015 5:43:25 PM . 154 , 635685182051540566
5/29/2015 5:43:25 PM . 153 , 635685182051530000

下面是显示值的razor代码:

@foreach (var date in Model)
{
    counter++;
    <div>
        @date . @date.Millisecond , @date.Ticks 
    </div>
}

可以看到,从数据库中读回的第二个值比第一个值低1.0566毫秒。

变化量的变化,正的和负的,总是在少数毫秒。

有谁知道日期值之间的转换是如何发生的吗?

注意:如果我使用相同的上下文来读取日期值,则值匹配。我认为这是因为它使用的是缓存值,而不是SQL Server的值。

EF DateTimes不匹配SQL Server中保存的值

问题是TSQL datetime和。net datetime数据类型之间的分辨率不同

datetime只有一个很小的分辨率,并且四舍五入到0.00000、0.003或0.007秒的增量,而datetime的结果为100ns

只需使用新的datetime2 SQL数据类型,它具有与。net的DateTime相同的分辨率,无论如何在新工作中推荐,正是针对您注意到的问题

这实际上与实体框架几乎没有关系。2008年的SQL Server有两种DateTime类型:

DateTime

精度:四舍五入到0.00000、0.003或0.007秒的增量

DateTime2

精度:100纳秒

使用代码优先注解,你可以像这样设置属性类型:

public MyClass
{
    [Column(“CreatedOn", TypeName="DateTime2")] 
    public DateTime CreatedOn { get; set; }
}

或使用Fluent API

modelBuilder.Entity<MyClass>()
  .Property(p => p.CreatedOn)
  .HasColumnType("DateTime2");