我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。
保存时,返回一个错误:
将datetime2数据类型转换为datetime数据类型会导致值超出范围
它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。
date列设置为DateTime,如下所示:
新数据专栏(“myDate, Type.GetType”)
问题
是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?
我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。
保存时,返回一个错误:
将datetime2数据类型转换为datetime数据类型会导致值超出范围
它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。
date列设置为DateTime,如下所示:
新数据专栏(“myDate, Type.GetType”)
问题
是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?
当前回答
对我来说,这是因为约会时间是…
01/01/0001 00:00:00
在这种情况下,你想要分配null给你EF DateTime对象…以我的FirstYearRegistered代码为例
DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
vehicleData.DateFirstReg = FirstYearRegistered;
}
其他回答
在模型类的属性上添加下面提到的属性。
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?)。我也没有选择使用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;
}
}
}
}
}
}
有时EF不知道它是在处理计算列还是触发器。按照设计,这些操作将在插入操作后的EF之外设置一个值。
修复方法是在EF的edmx中为StoreGeneratedPattern属性中的列指定Computed。
对我来说,这是当列有一个插入当前日期和时间的触发器时,参见下面的第三部分。
解决方法
在Visual Studio中打开模型浏览器页面,然后是模型,然后是实体类型->
选择实体和日期时间属性 选择StoreGeneratedPattern 设置为Computed
对于这种情况,其他答案是变通的,因为列的目的是在创建记录时指定一个时间/日期,而SQL的任务是执行一个触发器来添加正确的时间。例如下面的SQL触发器:
DEFAULT (GETDATE()) FOR [datecrecreated]。
最简单的方法是将数据库更改为使用datetime2而不是datetime。兼容性工作得很好,你不会得到你的错误。
你仍然需要做一堆测试……
这个错误可能是因为您试图将日期设置为0年或其他什么-但这完全取决于您可以在哪里控制更改内容。
在我的例子中,当为Nullable DateTime列显式分配NULL值时,然后尝试保存更改。这个错误将会弹出。