将DateTime保存到代码优先生成的数据库异常

时间:2012-01-27 16:58:08

标签: asp.net-mvc-3 entity-framework datetime sqlexception

我有以下模型实体:

public class ScheduledTask
    {
        public virtual int ScheduledTaskId { get; set; }    
        public virtual Incident TemplateIncident { get; set; }
        //Some props are omitted for simplicity    
        [Display(Name = "Next runtime")]
        [Required]
        [DataType(DataType.DateTime)]
        public virtual DateTime NextExecuteAfterDate { get; set; }
    }

它是DataContext的一部分:

public DbSet<ScheduledTask> ScheduledTasks { get; set; }

解决方案中的UI是MVC3站点。

每当用户保存记录时,正在保存可调度任务:

_db.Add(new ScheduledTask
                        {
                            NextExecuteAfterDate = DateTime.MinValue,
                            Schedule = scheduleTypeId,
                            TemplateIncident = incident
                        });
            _db.SaveChanges();

如您所见,我正在创建实体类的实例,为DateTime属性分配最小值并将其添加到DbContext。然后我拨打SaveChanges()

SaveChages()生成

[SqlException (0x80131904): The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.]

数据库中的NextExecuteAfterDatedatetime, not null类型的列。

datetime2来自哪里,如何解决问题并让EF向表中添加行?

1 个答案:

答案 0 :(得分:1)

sql server希望在数据库中存储1.1.0001,但这不在SQL Server DateTimes的范围内。 我没有那么多EF,但在其他ORM中你可以简单地将DateTime更改为Nullable并显式存储空值。 像这样:

public class ScheduledTask
{
    public virtual int ScheduledTaskId { get; set; }    
    public virtual Incident TemplateIncident { get; set; }
    //Some props are omitted for simplicity    
    [Display(Name = "Next runtime")]
    [DataType(DataType.DateTime)]
    public virtual DateTime? NextExecuteAfterDate { get; set; }
}

也许这适用于EF