SaveChangesAsync错误:将DateTime2转换为DateTime超出范围

时间:2015-09-27 04:30:16

标签: c# entity-framework datetime async-await

我知道在StackOverflow上已经多次询问过这个问题,但是没有一个答案似乎适合我的情况,或者他们只是告诉他们在DateTime中允许NULL字段(我不想这样做)做)。

以下是代码:

public async Task<int> CreateJobAsync(JobViewModel jvm)
    {
        Job j = new Job();
        j.Name = jvm.Name;
        j.UserId = jvm.UserId;
        j.ClassDefinition = jvm.ClassDefinition;
        j.DaysToRun = jvm.DaysToRun;
        j.ToEmail = jvm.ToEmail;
        j.Active = true;
        j.CreatedDate = DateTime.Now;
        j.ModifiedDate = DateTime.Now;

        context.Jobs.Add(j);
        var result = await context.SaveChangesAsync();

        return result;
    }

Job类中的所有字段都是DateTime,数据库中的对象也是NULL。日期值不是await。当我运行 Sql Profiler 时,它甚至不显示已进行数据库调用。

not null来电时出现错误,它是:

  

将datetime2数据类型转换为日期时间数据类型会导致超出范围的值

这似乎是一个相当简单的例子,我确实需要这些值为 protected void RETRIEVE_BUTTON_Click(object sender, EventArgs e) { AjaxControlToolkit.TabContainer container = new AjaxControlToolkit.TabContainer(); container.ID = DateTime.Now.Millisecond.ToString(); container.EnableViewState = false; container.Tabs.Clear(); container.Height = Unit.Pixel(500); container.Width = Unit.Pixel(1200); container.Tabs.AddAt(0, GetManualTab()); foreach (ListItem item in SelectionListBox.Items) { if (item.Selected) { Label tabContent = new Label(); tabContent.ID = "lbl_tab_"; tabContent.Text += item.Value; AjaxControlToolkit.TabPanel panel = new AjaxControlToolkit.TabPanel(); panel.HeaderText += item.Value; container.Tabs.Add(panel); panel.Controls.Add(tabContent); if (string.Compare(item.Value,"item 1",true) == 0) { ChartArea mainArea; Chart mainChart; Series mainSeries; mainChart = new Chart(); mainSeries = new Series("MainSeries"); mainSeries.Points.AddXY(1, 1); mainSeries.Points.AddXY(2, 2); mainSeries.Points.AddXY(3, 3); mainSeries.Points.AddXY(4, 4); mainChart.Series.Add(mainSeries); mainArea = new ChartArea("MainArea"); mainChart.ChartAreas.Add(mainArea); panel.Controls.Add(mainChart); } if (string.Compare(item.Value,"item 2",true) == 0) { ChartArea mainArea; Chart mainChart; Series mainSeries; mainChart = new Chart(); mainSeries = new Series("MainSeries"); mainSeries.Points.AddXY(2, 4); mainSeries.Points.AddXY(3, 6); mainSeries.Points.AddXY(4, 8); mainSeries.Points.AddXY(6, 1); mainChart.Series.Add(mainSeries); mainArea = new ChartArea("MainArea"); mainChart.ChartAreas.Add(mainArea); panel.Controls.Add(mainChart); } } } PlaceHolder1.Controls.Add(container); } 。任何其他想法???

2 个答案:

答案 0 :(得分:2)

DateTime是.Net中的值类型,永远不会为null。

现在,据说,DateTime的默认值是DateTime.MinValue中的C#,等于01/01/0001,默认情况下所有DateTime字段都会获得此值,除非另有说明!但是,此日期超出SQLServer日期范围,最短日期为1/1/1753。可能这就是你得到这个例外的原因。

使代码可用的一种方法是使用SqlDateTime.MinValue而不是DateTime.MinValue。

答案 1 :(得分:2)

Job中的其他字段必须在代码中未设置类型DateTime。此未设置属性将默认为DateTime.MinValue,即1-Jan-0001。 SQL类型DATETIME仅支持年份大于1752的日期。因此,您的例外原因。

最简单的解决方案是将数据库更改为使用DATETIME2而不是DATETIME。另请参阅DateTime2 vs DateTime in SQL Server