将datetime2数据类型转换为datetime数据类型导致超出范围的值。

22

我有一个ASP.NET MVC应用程序,我正在编辑现有的数据库以更新一个特定字段DateTime。我的数据库有4个字段,其中两个是DateCreatedDateModified。当我尝试更新该字段时,我希望保持DateCreated的时间不变,没有更新它被创建的日期的原因,并使用DateTime.Now更改DateModified时间为当前时间。

以下是代码,以防我做错了什么。这是我第一次使用ASP.NET MVC,请轻善对待。我看到其他答案中调用了Context,但我找不到任何参考。当我运行应用程序时,我会收到标题中的错误信息,contractEntity.SaveChanges()显示为红色。

public ActionResult Edit(Contract editContract) {
var contract = (from c in contractEntity.Contracts where c.Id == editContract.Id select c).First();
if (!ModelState.IsValid)
    return View(contract);
// editContract.DateCreated = contract.DateCreated;
// editContract.DateModified = DateTime.Now;
  contractEntity.ApplyCurrentValues(contract.EntityKey.EntitySetName, editContract);
  contractEntity.SaveChanges();
  return RedirectToAction("Index");
}

请帮忙,感激不尽。谢谢。


我相信自从这篇文章写出来以后,手动修改edmx不是答案。2011年发布的那篇文章由Jamiegs发布的更有可能成为候选者。 - ΩmegaMan
5个回答

38

对我而言,我遇到了同样的问题,但问题在于当我保存我的模型时,默认会创建一个无效的日期时间。我有一个名为 CreatedOn 的字段,但没有将其设置为任何值,这意味着该值为 01/01/0001,对于 SQL 来说是一个无效的日期时间。对其进行设置使我解决了这个问题。


2
我想知道为什么EF 4.3 Code-First在SQL Server 2008 R2数据库中仍然创建一个datetime字段,而不是datetime2。 - IsmailS

19

阅读这个网站后,我发现需要打开我的数据库的.edmx文件并更改:

<...Provider="System.Data.SqlClient" ProviderManifestToken="2008".../>
<...Provider="System.Data.SqlClient" ProviderManifestToken="2005".../>

这个方法可行吗?还有没有更好的方法来解决这个错误?


抱歉,如果我已经发布了文章会更有帮助。 - Anthony Forloney
5
这个变化完全停止了EF使用DATETIME2类型。对于你的应用程序来说,这是正确的解决方案吗?只有你自己能回答。如果你打算使用DATETIME2,请围绕它做好计划。 - Craig Stuntz
这是我特定应用程序的正确解决方案,但您知道有没有其他方法吗?我不知道为什么会出现错误,因为我更改的字段是DateTime而不是DateTime2。 - Anthony Forloney
3
这是一个非常烦人的问题。我正在使用VS2010,EF 4.0,数据库运行在SQL Server 2008上。我无法修改数据库以使用datetime2字段。如果EF在edmx中明确指定属性类型会更好,因为现在它显示为“DateTime”,但实际上它将其转换为datetime2,而不是datetime。 - marcel_g

11

您还可以编辑模型(或在EF中的.edmx文件中)并将StoreGeneratedPattern设置为计算,对于相关字段。这将导致它不保存到该字段,因为它由SQL服务器计算。


这种方法在这种情况下效果最佳。只需注意,它仅在数据库中指定了默认值时才有效。由于问题涉及到DateCreated和DateModified,因此这些可能会被设置为“DEFAULT GETDATE()”。 - CrazyPyro

7

我遇到了同样的错误,发现如果你有一个带有DateTime可为空字段的SQL 2008数据库,在代码中不要将Null(Nothing)显式赋值给该字段,否则会导致此错误,或者您可以将所有DateTime字段更改为DateTime2。


3

如果你的数据库列可以为空,那么在你的领域实体属性中使用DateTime可空类型,如DateTime?。这样就可以使其正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接