我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。
保存时,返回一个错误:
将datetime2数据类型转换为datetime数据类型会导致值超出范围
它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。
date列设置为DateTime,如下所示:
新数据专栏(“myDate, Type.GetType”)
问题
是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?
我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。
保存时,返回一个错误:
将datetime2数据类型转换为datetime数据类型会导致值超出范围
它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。
date列设置为DateTime,如下所示:
新数据专栏(“myDate, Type.GetType”)
问题
是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?
当前回答
如果我们不传递一个日期时间到日期时间字段,默认日期{1/1/0001 12:00:00 AM}将被传递。
但是这个日期与实体框架工作不兼容,所以它会抛出 将datetime2数据类型转换为datetime数据类型会导致值超出范围
只需要默认DateTime。如果您没有传递任何日期,那么现在进入日期字段。
movie.DateAdded = System.DateTime.Now
其他回答
对我来说,这是因为约会时间是…
01/01/0001 00:00:00
在这种情况下,你想要分配null给你EF DateTime对象…以我的FirstYearRegistered代码为例
DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
vehicleData.DateFirstReg = FirstYearRegistered;
}
已经有很多好的答案了。我想展示一种使用实体框架core fluent api来解决这个问题的方法。 大多数情况下,错误发生在默认情况下生成DateTime值时,因此您需要覆盖DataContext中的OnModelCreating,并在您的特定实体的属性中手动添加默认值,以便EF能够正确地转换到数据库,如下所示:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>(entity =>
{
entity.ToTable("MyTable");
entity.Property(e => e.MyColumnDateTime)
.HasDefaultValueSql("GETDATE()");
});
OnModelCreatingPartial(modelBuilder);
}
最简单的方法是将数据库更改为使用datetime2而不是datetime。兼容性工作得很好,你不会得到你的错误。
你仍然需要做一堆测试……
这个错误可能是因为您试图将日期设置为0年或其他什么-但这完全取决于您可以在哪里控制更改内容。
在模型类的属性上添加下面提到的属性。
Attribute = [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
Reference = System.ComponentModel.DataAnnotations.Schema
最初我忘记添加这个属性。在我的数据库中,约束是这样创建的
ALTER TABLE [dbo].[TableName] ADD DEFAULT (getdate()) FOR [ColumnName]
我添加了这个属性并更新了我的db,然后它就变成了
ALTER TABLE [dbo].[TableName] ADD CONSTRAINT [DF_dbo.TableName_ColumnName] DEFAULT (getdate()) FOR [ColumnName]
DATETIME和DATETIME2都映射到System。. net中的DateTime——你不能真正地进行“转换”,因为它实际上是相同的。net类型。
请参阅MSDN文档页面:http://msdn.microsoft.com/en-us/library/bb675168.aspx
这两个的“SqlDbType”有两个不同的值——你能在你的DataColumn定义中指定它们吗?
但是:在SQL Server上,支持的日期范围是非常不同的。
DATETIME支持1753/1/1到“永恒”(9999/12/31),而DATETIME2支持0001/1/1到永恒。
所以你真正需要做的是检查日期的年份-如果它是在1753年之前,你需要将它更改为1753年之后,以便SQL Server中的DATETIME列处理它。
Marc