Oracle Entity Framework提供程序不会以毫秒为单位存储DateTime.Now

时间:2015-05-14 22:57:45

标签: c# oracle entity-framework datetime

我和这个家伙基本上有完全相同的问题。

why i can't save the current DateTime.Now using Entity Framework

但他正在使用SQL Server,而我正在使用Oracle。 (我的申请必须同时使用)

他的问题是在数据库级别没有正确设置精度。

我注意到如果我在oracle数据库中手动编辑毫秒,EF可以用毫秒提取正确的时间戳。但是当我创建一个带有DateTime属性的实体到“DateTime.Now”时,它会被截断。

DateColumn1属性属于Oracle类型Timestamp

我记录了插入语句

insert into "SchemaName"."TableName"("DateColumn1") values (:P0) --:P0:'5/14/2015 4:07:27 PM' (Type = Date)

疯狂的是,它适用于SQL Server。

3 个答案:

答案 0 :(得分:7)

啊哈!我很棒的同事有个主意,而且很有效!

在我们的EF代码中,我们尝试了

System.Numerics.Matrix4x4

然后将System.Numerics.Vector3.Transform()毫秒存储到数据库中

更新 - 值得一提的是我是如何陷入这种困境的

在“测试”应用程序中使用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不存储毫秒。

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

    1. 我希望应用程序使用Code First方法(只是我的偏好。我认为它更容易维护)
    2. 所以我连接到SQL Server数据库并从该模式生成了所有类。
    3. 我通过了所有单元测试,然后决定使用Oracle数据库进行测试
    4. 即使在从DATE更改为Timestamp后,我仍然遇到毫秒问题。
    5. 我在Oracle中使用protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<EntityClass>().Property(p => p.TIMESTAMP).HasPrecision(6); } 类型的测试视觉工作室解决方案中生成了另一个Code First模型,除了我查看DateTime.Now代码时,它没有使用TIMESTAMP(6)生成任何内容在生成的C#POCO类中,属性上也没有装饰器。
    6. 我注意到,如果OnModelCreating中有HasPrecision(6)代码,则代码优先HasPrecision(6)将实际生成Oracle OnModelCreating。如果不这样做,那么Oracle EF提供程序将使用CreateDatabase()
    7. 我认为如果你采用Model First方法,你可以在EDMX图中设置精度值,但我听说这是不好的做法。

答案 1 :(得分:2)

另一种可能的解决方案是在配置类中设置精度。 如果您拥有这样的实体:

public class MyEntity
    {
        public DateTime? MyDateTimeWithPrecision{ get; set; }
    }

如果您使用要在模型构建器上添加的配置,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
         modelBuilder.Configurations.Add(new MyEntityConfiguration());
        }

然后在您的配置类中,您可以执行以下操作:

class MyEntityConfiguration : EntityTypeConfiguration<MyEntity>
    {
        public MyEntityConfiguration()
        {
            Property(e => e.MyDateTimeWithPrecision)
                .HasPrecision(6);
         }
     }

使用此体系结构解决方案,您可以为模型的每个实体拥有一个MyEntityConfiguration类,因此您的代码应更具可读性。

答案 2 :(得分:1)

我想补充一点,因为这有点让我困惑,并把我送错了轨道。我试图做的时候,日期字段不应该使用TIMESTAMP注释。 POCO类中的字段应保留为DateTime:

   public class TimeClass
    {
        public DateTime? StartTime { get; set; }
        public DateTime? StopTime { get; set; }
    }

然后,在为每个模型类中的每个日期字段创建模型时,必须设置字段的精度

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("MySchema"); //see [here][2]

        modelBuilder.Entity<TimeClass>().Property(p => p.StartTime).HasPrecision(6);
        modelBuilder.Entity<TimeClass>().Property(p => p.StopTime).HasPrecision(6);

    }

然后你可以得到毫秒。默认情况下,使用DateTime字段

记录带秒的时间