Oracle 实体框架提供程序不存储 DateTime.Now 与毫秒



我有一个和这个人基本相同的问题。

为什么我不能'保存当前日期时间。现在使用实体框架

但是他用的是SQL Server,而我用的是Oracle。(我的应用程序必须与两者一起工作)

他的问题是精度没有正确地设置在db级别。

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

DateColumn1属性是Oracle类型Timestamp

我记录了插入语句

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

啊哈!我那了不起的同事想出了一个主意,而且成功了!

在我们的EF代码中,我们尝试放入

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<EntityClass>().Property(p => p.TIMESTAMP).HasPrecision(6);
}

然后以毫秒为单位的DateTime.Now被存储到数据库

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

在"测试"应用程序中使用Model First构建数据库

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

    第一个问题 -我的Oracle DDL使用日期而不是时间戳。一定要使用时间戳!!

使用Code First from Database for actual solution

  1. 我希望应用程序使用代码优先的方法(只是我的偏好。我认为它更容易维护)
  2. 所以我连接到SQL Server数据库并从该模式生成我所有的类。
  3. 我得到了我所有的单元测试通过,然后决定测试它与Oracle数据库
  4. 即使从DATE更改为时间戳,我仍然有毫秒进入的问题。
  5. 我在Oracle中使用TIMESTAMP(6)类型的测试visual studio解决方案中生成了另一个Code First模型,除了当我查看OnModelCreating代码时,它没有使用HasPrecision(6)生成任何东西,也没有在生成的c# POCO类中对属性进行任何装饰。
  6. 我注意到,如果你在OnModelCreating中有HasPrecision(6)代码,那么代码优先的CreateDatabase()实际上会生成Oracle TIMESTAMP(6)。如果您不这样做,那么Oracle EF提供程序将使用DATE

我认为如果你采用模型优先的方法,你可以在EDMX图中设置精度值,但我听说这是不好的做法。

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

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类,因此您的代码应该更具可读性。

我想添加到上面,因为这有点让我困惑,并把我送到错误的轨道。日期字段不应该像我尝试的那样使用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<TimeClass>().Property(p => p.StartTime).HasPrecision(6);
        modelBuilder.Entity<TimeClass>().Property(p => p.StopTime).HasPrecision(6);
    }

然后你可以得到毫秒数。以秒为单位的时间默认记录在DateTime字段

相关内容

  • 没有找到相关文章

最新更新