我使用C#Entity Framework保存日期时间,当我从数据库加载该时间时,时间与我保存的值相差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
以下是显示值的剃刀代码:
@foreach (var date in Model)
{
counter++;
<div>
@date . @date.Millisecond , @date.Ticks
</div>
}
如您所见,从数据库读回的第二个值比第一个值低1.0566毫秒。
变化量有所不同,正面和负面,总是有少量的毫秒。
有谁知道日期值之间的转换是如何发生的?
注意:如果我使用相同的上下文来读取日期值,则值匹配。我认为这是因为它使用的是缓存值,而不是SQL Server值。
答案 0 :(得分:6)
问题是TSQL datetime和.NET DateTime数据类型之间的不同分辨率
datetime只有很小的分辨率,并且四舍五入到.000,.003或.007秒的增量,而DateTime的结果为100ns
只需使用新的datetime2 SQL数据类型,它具有与.NET的DateTime相同的分辨率,无论如何在新工作中推荐,完全针对您注意到的问题
答案 1 :(得分:2)
这实际上与Entity Framework几乎没有任何关系。截至2008年的SQL Server有两种DateTime类型:
准确度:舍入为.000,.003或.007秒的增量
准确度:100纳秒
使用Code-First Annotations,您可以设置属性类型,如:
public MyClass
{
[Column(“CreatedOn", TypeName="DateTime2")]
public DateTime CreatedOn { get; set; }
}
或使用Fluent API:
modelBuilder.Entity<MyClass>()
.Property(p => p.CreatedOn)
.HasColumnType("DateTime2");