我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。
保存时,返回一个错误:
将datetime2数据类型转换为datetime数据类型会导致值超出范围
它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。
date列设置为DateTime,如下所示:
新数据专栏(“myDate, Type.GetType”)
问题
是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?
我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。
保存时,返回一个错误:
将datetime2数据类型转换为datetime数据类型会导致值超出范围
它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。
date列设置为DateTime,如下所示:
新数据专栏(“myDate, Type.GetType”)
问题
是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?
当前回答
这个人快把我逼疯了。我想避免使用可空的日期时间(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;
}
}
}
}
}
}
其他回答
对我来说,这是因为约会时间是…
01/01/0001 00:00:00
在这种情况下,你想要分配null给你EF DateTime对象…以我的FirstYearRegistered代码为例
DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
vehicleData.DateFirstReg = FirstYearRegistered;
}
最简单的方法是将数据库更改为使用datetime2而不是datetime。兼容性工作得很好,你不会得到你的错误。
你仍然需要做一堆测试……
这个错误可能是因为您试图将日期设置为0年或其他什么-但这完全取决于您可以在哪里控制更改内容。
我在一个简单的控制台应用程序项目中遇到了这个问题,我的快速解决方案是通过运行这个方法将任何可能的datetime2日期转换为可空的datetime:
static DateTime? ParseDateTime2(DateTime? date)
{
if (date == null || date.ToString() == "1/1/0001 12:00:00 AM")
{
return null;
}
else
{
return date;
}
}
这当然不是一个完全全面的方法,但它满足了我的需要,也许它会帮助其他人!
在我的例子中,当为Nullable DateTime列显式分配NULL值时,然后尝试保存更改。这个错误将会弹出。
在我的SQL Server 2008数据库中,我有一个标记为不可空的DateTime列,但有一个GetDate()函数作为其默认值。当使用EF4插入新对象时,我得到了这个错误,因为我没有显式地在对象上传递DateTime属性。我期望SQL函数为我处理日期,但它没有。我的解决方案是从代码中发送日期值,而不是依赖数据库来生成它。
obj.DateProperty = DateTime.now; // C#