Oracle Entity Framework提供程序不会以毫秒为单位存储DateTime.Now
我和这个家伙基本上有完全相同的问题。
为什么我无法使用Entity Framework保存当前的DateTime.Now
但他使用的是SQL Server,而我正在使用Oracle。 (我的申请必须与两者合作)
他的问题是在数据库级别没有正确设置精度。
我注意到如果我手动编辑我的oracle数据库中的毫秒数,EF可以用毫秒提取正确的时间戳。 但是当我创建一个带有DateTime属性的实体到“DateTime.Now”时,它会被截断。
DateColumn1属性属于Oracle类型Timestamp
我记录了insert语句
insert into "SchemaName"."TableName"("DateColumn1") values (:P0) --:P0:'5/14/2015 4:07:27 PM' (Type = Date)
疯狂的是,这适用于SQL Server。
啊哈! 我真棒的同事有个主意,而且很有效!
在我们的EF代码中,我们尝试了
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().Property(p => p.TIMESTAMP).HasPrecision(6); }
然后将DateTime.Now
(毫秒)存储到数据库中
更新 – 值得一提的是我是如何陷入这种困境的
在“测试”应用程序中使用Model First构建数据库
- 我的应用程序必须与SQL Server和Oracle一起使用。 所以…
- 我开始在EDMX Diagram中设计我的数据库
- 完成图表后,我为SQL Server生成了DDL。
-
由于某种原因,Oracle EF提供程序无法生成DDL,因此我继续手动更改SQL Server DDL,因此它在语法上是正确的
第一个问题 – 我的Oracle DDL使用的是Date而不是Timestamp。 确保你使用时间戳!!! Oracle中的DateTime不存储毫秒。
使用数据库中的Code First作为实际解决方案
- 我希望应用程序使用Code First方法(只是我的偏好。我认为它更容易维护)
- 所以我连接到SQL Server数据库并从该模式生成了所有类。
- 我通过了所有unit testing,然后决定使用Oracle数据库进行测试
- 即使从DATE更改为Timestamp,我仍然遇到毫秒问题。
- 我在Oracle中使用
TIMESTAMP(6)
类型的测试视觉工作室解决方案中生成了另一个Code First模型,除了我查看OnModelCreating
代码时,它没有使用HasPrecision(6)
生成任何内容,也没有在属性中有任何装饰器生成的C#POCO类。 - 我注意到如果你的
HasPrecision(6)
有HasPrecision(6)
代码,Code FirstCreateDatabase()
实际上会创建一个OracleTIMESTAMP(6)
。 如果不这样做,那么Oracle EF提供程序将使用DATE
我想如果你使用Model First方法,你可以在EDMX图中设置精度值,但我听说这是不好的做法。
我想补充一点,因为这有点让我很困惑,并把我送错了轨道。 我尝试这样做时,日期字段不应该使用TIMESTAMP注释。 POCO类中的字段应保留为DateTime:
public class TimeClass { public DateTime? StartTime { get; set; } public DateTime? StopTime { get; set; } }
然后,在为每个模型类中的每个Date字段创建模型时,必须设置字段的精度
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("MySchema"); //see [here][2] modelBuilder.Entity().Property(p => p.StartTime).HasPrecision(6); modelBuilder.Entity ().Property(p => p.StopTime).HasPrecision(6); }
然后你可以得到毫秒。 默认情况下,使用DateTime字段记录时间(秒)