我有一个和这个人基本相同的问题。
为什么我不能'保存当前日期时间。现在使用实体框架
但是他用的是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构建数据库
- 我的应用程序必须与SQL Server和Oracle工作。所以…
- 我开始设计我的数据库在一个EDMX图 图完成后,我为SQL Server生成DDL。
由于某些原因,Oracle EF提供程序无法生成DDL,因此我继续手动更改SQL Server DDL,以便语法正确
第一个问题 -我的Oracle DDL使用日期而不是时间戳。一定要使用时间戳!!
使用Code First from Database for actual solution
- 我希望应用程序使用代码优先的方法(只是我的偏好。我认为它更容易维护)
- 所以我连接到SQL Server数据库并从该模式生成我所有的类。
- 我得到了我所有的单元测试通过,然后决定测试它与Oracle数据库
- 即使从DATE更改为时间戳,我仍然有毫秒进入的问题。
- 我在Oracle中使用
TIMESTAMP(6)
类型的测试visual studio解决方案中生成了另一个Code First模型,除了当我查看OnModelCreating
代码时,它没有使用HasPrecision(6)
生成任何东西,也没有在生成的c# POCO类中对属性进行任何装饰。 - 我注意到,如果你在
OnModelCreating
中有HasPrecision(6)
代码,那么代码优先的CreateDatabase()
实际上会生成OracleTIMESTAMP(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字段