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

Ant*_*ney 22 asp.net-mvc datetime entity-framework

我有一个ASP.NET MVC应用程序,我正在编辑现有数据库以更新特定字段DateTime.我的数据库有4个字段,其中两个是DateCreatedDateModified.当我尝试更新字段时,我想保持DateCreated时间相同,没有理由更新它的创建日期,并且我将DateModified时间更改为当前时间DateTime.Now

这是给定的代码,只是在我做错了什么的情况下.这是我第一次使用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");
}
Run Code Online (Sandbox Code Playgroud)

请,任何帮助表示赞赏.谢谢.

Col*_*ith 38

对我来说,我有同样的问题,但问题是默认情况下,当我保存模型时,正在创建无效的DateTime.我有一个字段CreatedOn并没有将它设置为任何东西,这意味着值为01/01/0001这是一个无效的SQL DateTime.设置它摆脱了我的问题.

  • 我想知道为什么EF 4.3 Code-First仍然为SQL Server 2008 R2数据库而不是datetime2创建一个日期时间字段. (2认同)

Ant*_*ney 19

阅读本网站后,我发现打开了我的数据库的.edmx文件并进行了更改:

<...Provider="System.Data.SqlClient" ProviderManifestToken="2008".../>
Run Code Online (Sandbox Code Playgroud)

<...Provider="System.Data.SqlClient" ProviderManifestToken="2005".../>
Run Code Online (Sandbox Code Playgroud)

这是可以接受的还是有更好的方法来解决这个错误?

  • 此更改会阻止EF完全使用DATETIME2类型.这是您的应用程序的正确解决方案吗?只有你可以这么说.如果您打算使用DATETIME2,请计划一下. (5认同)
  • 这是一个非常烦人的问题.我正在使用VS2010,EF 4.0,并且数据库在SQL Server 2008上运行.我无法修改数据库以使用datetime2字段.如果EF明确指出edmx中的属性类型会好得多,因为现在它说'DateTime',但是它将它转换为datetime2,而不是datetime. (3认同)

Jam*_*egs 12

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


Int*_*WAS 6

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