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构建数据库

  1. 我的应用程序必须与SQL Server和Oracle一起使用。 所以…
  2. 我开始在EDMX Diagram中设计我的数据库
  3. 完成图表后,我为SQL Server生成了DDL。
  4. 由于某种原因,Oracle EF提供程序无法生成DDL,因此我继续手动更改SQL Server DDL,因此它在语法上是正确的

    第一个问题 – 我的Oracle DDL使用的是Date而不是Timestamp。 确保你使用时间戳!!! Oracle中的DateTime不存储毫秒。

使用数据库中的Code First作为实际解决方案

  1. 我希望应用程序使用Code First方法(只是我的偏好。我认为它更容易维护)
  2. 所以我连接到SQL Server数据库并从该模式生成了所有类。
  3. 我通过了所有unit testing,然后决定使用Oracle数据库进行测试
  4. 即使从DATE更改为Timestamp,我仍然遇到毫秒问题。
  5. 我在Oracle中使用TIMESTAMP(6)类型的测试视觉工作室解决方案中生成了另一个Code First模型,除了我查看OnModelCreating代码时,它没有使用HasPrecision(6)生成任何内容,也没有在属性中有任何装饰器生成的C#POCO类。
  6. 我注意到如果你的HasPrecision(6)HasPrecision(6)代码,Code First CreateDatabase()实际上会创建一个Oracle TIMESTAMP(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字段记录时间(秒)