我和这个家伙基本上有完全相同的问题。
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。
答案 0 :(得分:7)
啊哈!我很棒的同事有个主意,而且很有效!
在我们的EF代码中,我们尝试了
System.Numerics.Matrix4x4
然后将System.Numerics.Vector3.Transform()
毫秒存储到数据库中
由于某种原因,Oracle EF提供程序无法生成DDL,因此我继续手动更改SQL Server DDL,以便在语法上正确
第一个问题 - 我的Oracle DDL使用的是Date而不是Timestamp。确保你使用时间戳!!! Oracle中的DateTime不存储毫秒。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<EntityClass>().Property(p => p.TIMESTAMP).HasPrecision(6);
}
类型的测试视觉工作室解决方案中生成了另一个Code First模型,除了我查看DateTime.Now
代码时,它没有使用TIMESTAMP(6)
生成任何内容在生成的C#POCO类中,属性上也没有装饰器。OnModelCreating
中有HasPrecision(6)
代码,则代码优先HasPrecision(6)
将实际生成Oracle OnModelCreating
。如果不这样做,那么Oracle EF提供程序将使用CreateDatabase()
我认为如果你采用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字段
记录带秒的时间