datetime2数据类型转换为datetime数据类型Error

我有一个控制器:

[HttpPost] public ActionResult Create(Auction auction) { var db = new EbuyDataContext(); db.Auctions.Add(auction); db.SaveChanges(); return View(auction); } 

一个模型:

 public class Auction { public long Id { get; set; } public string Title { get; set; } public string Description { get; set; } public decimal StartPrice { get; set; } public decimal CurrentPrice { get; set; } public DateTime StartTime { get; set; } public DateTime EndTime { get; set; }} } 

一个观点:

 @model Ebuy.Website.Models.Auction @using (Html.BeginForm()) { 

//All the information fields... @Html.LabelFor(model => model.EndTime) @Html.EditorFor(model => model.EndTime)

}

当我尝试运行它时,我收到错误:

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

模型 – 控制器 – 视图来自一对一复制的书。

我需要输入EndTime字段的格式是什么,所以我不会有这个错误?

该错误是因为您实际上没有正确设置这些值,请确保根据应用程序区域设置来设置它们。 (例如, en-GB为dd / mm / yyyy, en-US为mm / dd / yyyy)。

看起来您的数据库已设置为使用datetime2列而不是 datetime列。

你可以:

A)修改数据库以将类型从datetime2更改为datetime

B)通过执行以下操作将模型中的类型更改为datetime2

 [Column(TypeName = "DateTime2")] public DateTime StartTime { get; set; } [Column(TypeName = "DateTime2")] public DateTime EndTime { get; set; } 

当我尝试将未分配的DateTime成员保存到数据库时,我遇到了同样的问题,同时使用了EntityFramework。 我在这里阅读了答案,并且我了解到可以通过将成员声明为可空来解决它。 我尝试过,它有效! 所以这里有一个代码快照,对于那些需要它的人:

 public Nullable MyDateTime { get; set; } 

要么

 public DateTime? MyDateTime { get; set; } 

后来我可以像下面一样使用它:

 if(MyDateTime.HasValue) { DoBlaBla(MyDateTime.Value); } 

或者只是为它分配一个值,就像什么都没发生一样……

 MyDateTime = DateTime.Now; 

具有datetime2数据类型的列是否接受空值。 如果没有,那么当您没有为这些列分配值时,您可能会收到此错误。

默认情况下,如果您的模型不使用可空属性,CodeFirst将生成不可为空的列。 尝试将这些属性转换为可为空的日期时间。

我也解决了这个问题。

将datetime2数据类型转换为日期时间数据类型导致超出范围的值是一个非常无用的错误。

要解决此问题,我必须执行以下操作(使用上面的示例):

可以从 – >工具 – >库包管理器 – >包管理器控制台找到包管理器控制台

我在软件包管理器控制台中启用了数据库迁移 – >启用 – 迁移

然后在Controller类中添加以下代码:

 public class Auction { public long Id { get; set; } public string Title { get; set; } public string Description { get; set; } public decimal StartPrice { get; set; } public decimal CurrentPrice { get; set; } // My Edit to the code Start --> public Nullable StartTime { get; set; } public Nullable EndTime { get; set; }} // My Edit to the code Finish <-- } 

然后在模型类中:

 [HttpPost] // My Edit to the code Start --> [DataType(DataType.Date)] [DisplayFormat(ApplyFormatInEditMode=true, DataFormatString = "{0:d}")]] // My Edit to the code Finish <-- public ActionResult Create(Auction auction) { // My Edit to the code Start --> if(ModelState.IsValid) { // Only Apply the DateTime if the Action is Valid... auction.StartTime = DateTime.Now; } // My Edit to the code Finish <-- var db = new EbuyDataContext(); db.Auctions.Add(auction); db.SaveChanges(); return View(auction); } 

然后将包管理器控制台中的更改添加到数据库 - >添加迁移(您的更改在此处)

然后在程序包管理器控制台 - > Update-Database中运行数据库更新

重要的是要看到数据库看到的数据在上面的实现中是正确的:

 EG: 17/06/2013 12:00:00 AM 

这个错误是一个非常愚蠢的错误,但它似乎已经吸引了很多人,包括我自己。 现在我知道为什么会出现这个错误,似乎很容易修复和解决,但为什么这个常见问题不会在MVC的最后一个版本中修复,这是我无法理解的。

当我尝试将change_date添加到服务层中的联系人实体时,我收到了类似的错误。 通过从控制器添加参数解决了该问题。 请尝试从Controller添加参数。

我在DB中的DateCreated上有一个默认的getdate()值。 我没有在EF中设置值,因为我认为我不需要。 一旦我通过插入EF传递了值,那么错误就消失了。 为什么那个错误首先在那里? 我从来没有想过这一点。

我建议将DateTime属性设置为可空,并使用属性validation来确保该值在可接受的范围内。

我创建了一个从RangeAttributeinheritance的自定义属性来validation日期值。

 public class DbDateRangeAttribute : RangeAttribute { public DbDateRangeAttribute() : base(typeof(DateTime), SqlDateTime.MinValue.Value.ToShortDateString(), SqlDateTime.MaxValue.Value.ToShortDateString()) { } } 

然后你使用这样的属性

 [DbDateRange] public DateTime? StartTime { get; set; } 

像这样,如果用户输入SqlDateTime范围之外的值(可能是因为客户端日期选择器问题),他将收到如下有意义的错误消息:

字段StartTime必须介于1/1/1753 12:00:00 AM和12/31/9999 12:00:00 AM之间。

我遇到了我的系统字段(created_on,modified_on),即使我的模型定义正确。

我的问题的原因是使用disabled属性vs readonly。 表单不会向控制器提交禁用的输入值,这会导致空值,从而导致最小日期/时间值。

错误:

 
@Html.LabelFor(model => model.CreatedOn, htmlAttributes: new { @class = "control-label col-lg-3" })
@Html.EditorFor(model => model.CreatedOn, new { htmlAttributes = new { @class = "form-control", disabled="disabled" } }) @Html.ValidationMessageFor(model => model.CreatedOn, "", new { @class = "text-danger" })

对:

 
@Html.LabelFor(model => model.CreatedOn, htmlAttributes: new { @class = "control-label col-lg-3" })
@Html.EditorFor(model => model.CreatedOn, new { htmlAttributes = new { @class = "form-control", @readonly="readonly" } }) @Html.ValidationMessageFor(model => model.CreatedOn, "", new { @class = "text-danger" })

这篇文章 – 解决方案:“将datetime2数据类型转换为日期时间数据类型导致超出范围的值”,在调用SaveChanges时使用Entity Framework – 建议使用该属性 。 它为我解决了这个问题。

 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public Nullable Created { get; set; }