我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。
保存时,返回一个错误:
将datetime2数据类型转换为datetime数据类型会导致值超出范围
它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。
date列设置为DateTime,如下所示:
新数据专栏(“myDate, Type.GetType”)
问题
是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?
我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。
保存时,返回一个错误:
将datetime2数据类型转换为datetime数据类型会导致值超出范围
它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。
date列设置为DateTime,如下所示:
新数据专栏(“myDate, Type.GetType”)
问题
是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?
当前回答
最简单的方法是将数据库更改为使用datetime2而不是datetime。兼容性工作得很好,你不会得到你的错误。
你仍然需要做一堆测试……
这个错误可能是因为您试图将日期设置为0年或其他什么-但这完全取决于您可以在哪里控制更改内容。
其他回答
这个人快把我逼疯了。我想避免使用可空的日期时间(DateTime?)。我也没有选择使用SQL Server 2008的datetime2类型
modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");
我最终选择了以下内容:
public class MyDb : DbContext
{
public override int SaveChanges()
{
UpdateDates();
return base.SaveChanges();
}
private void UpdateDates()
{
foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>())
{
var values = change.CurrentValues;
foreach (var name in values.PropertyNames)
{
var value = values[name];
if (value is DateTime)
{
var date = (DateTime)value;
if (date < SqlDateTime.MinValue.Value)
{
values[name] = SqlDateTime.MinValue.Value;
}
else if (date > SqlDateTime.MaxValue.Value)
{
values[name] = SqlDateTime.MaxValue.Value;
}
}
}
}
}
}
将此代码添加到ASP中的类中。NET为我工作:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
}
简短的回答
如果没有初始化DateTime字段的值,就会发生这种情况;该字段不接受NULL值,并且它是一个值类型,因此将使用不可空的DateTime类型的默认值。
设置值固定它为我!
长回答
默认值(DateTime)为DateTime。MinValue(或新的DateTime(1,1,1)或01/01/0001),这不是一个有效的SQL日期时间值。
由于使用的是公历,SQL Server datetime的最低有效值是01/01/1753。但是SQL Server DateTime2支持从01/01/0001开始的日期。实体框架默认使用DateTime2来表示日期,因此生成的SQL隐式地将生成的DateTime2值强制转换为SQL服务器端的DateTime值。
对我来说,这是因为约会时间是…
01/01/0001 00:00:00
在这种情况下,你想要分配null给你EF DateTime对象…以我的FirstYearRegistered代码为例
DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
vehicleData.DateFirstReg = FirstYearRegistered;
}
有时它在开发机器上工作得很好,而在服务器上则不行。在我的例子中,我必须写:
<globalization uiCulture="es" culture="es-CO" />
在网络上。配置文件。
机器(服务器)中的时区是正确的(CO地区),但web应用程序不是。这个设置完成了,它再次工作正常。
当然,所有的约会都是有价值的。
:D