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

Posted

技术标签:

【中文标题】将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围【英文标题】:The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value 【发布时间】:2009-11-05 05:12:01 【问题描述】:

我有一个 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 的候选人。 【参考方案1】:

对我来说,我遇到了同样的问题,但问题是默认情况下,当我保存我的模型时,会创建一个无效的 DateTime。我有一个 CreatedOn 字段,但没有将其设置为任何值,这意味着该值为 01/01/0001,这对于 SQL 来说是无效的 DateTime。设置它为我解决了这个问题。

【讨论】:

我想知道为什么 EF 4.3 Code-First 仍然为 SQL Server 2008 R2 数据库而不是 datetime2 创建一个日期时间字段。【参考方案2】:

阅读this website后发现打开我的数据库的.edmx文件并更改:

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

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

这是可以接受的还是有更好的方法来修复该错误?

【讨论】:

ifunky.net/post/… 抱歉,如果我发帖会有所帮助。 此更改完全停止 EF 使用 DATETIME2 类型。这是您的应用程序的正确解决方案吗?只有你可以这么说。如果您打算使用 DATETIME2,请围绕它进行计划。 这是我的特定应用程序的正确解决方案,但您知道解决方法吗?我不知道为什么会发生错误,因为我正在更改的字段是 DateTime 而不是 DateTime2 这是一个非常烦人的问题。我正在使用 VS2010、EF 4.0,并且数据库在 SQL Server 2008 上运行。我无法修改数据库以使用 datetime2 字段。如果 EF 明确说明 edmx 中的属性类型会更好,因为现在它说“DateTime”,但它正在将其转换为 datetime2,而不是 datetime。【参考方案3】:

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

【讨论】:

这种方式在这种情况下效果最好。请注意,它在您在数据库中指定了默认值时才有效。由于问题是关于 DateCreated 和 DateModified,这些可能会设置为 DEFAULT GETDATE()【参考方案4】:

我有同样的错误,我发现如果您有一个带有 DateTime Nullable 字段的 SQL 2008 DB,请不要将 Null (Nothing) 显式分配给代码中的字段,这将导致此错误,或者您可以将所有 DateTime 字段更改为 DateTime2。

【讨论】:

【参考方案5】:

只使用可以为空的 DateTime,例如 DateTime?如果您的数据库中的列可以为空,则在您的域实体属性中。这将使它工作。

【讨论】:

以上是关于将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围的主要内容,如果未能解决你的问题,请参考以下文章

将 datetime2 数据类型转换为 datetime 数据错误

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

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

哪一列导致“将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围”?

如何识别列抛出 System.Data.SqlClient.SqlException? (将 datetime2 数据类型转换为 datetime 数据类型)

如何将 sql datetime2 转换为加倍?