11

我有一个控制器:

[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())
{
    <p>
        //All the information fields...
        @Html.LabelFor(model => model.EndTime)
        @Html.EditorFor(model => model.EndTime)
    </p>
}

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

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

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

我需要在该EndTime字段中输入什么格式才能不会出现此错误?

4

10 回答 10

22

错误是因为您实际上没有正确设置这些值,请确保根据您的应用程序语言环境设置它们。(例如 dd/mm/yyyy 代表en-GB, mm/dd/yyyy 代表en-US)。

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

您可以:

A)修改数据库以将类型从更改datetime2datetime

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

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

[Column(TypeName = "DateTime2")]
public DateTime EndTime { get; set; }
于 2013-04-30T11:43:08.350 回答
13

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

public Nullable<DateTime> MyDateTime { get; set; }

或者

public DateTime? MyDateTime { get; set; }

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

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

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

MyDateTime = DateTime.Now;
于 2013-12-04T14:11:49.557 回答
3

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

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

于 2013-04-30T11:36:06.977 回答
0

我也遇到了这个问题。

将 datetime2 数据类型转换为 datetime 数据类型导致超出范围的值是一个非常无用的错误,人们会收到此错误。

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

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

我在 Package Manager Console -> Enable-Migrations 中启用了数据库迁移

然后在控制器类中添加以下代码:

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<DateTime> StartTime { get; set; }
public Nullable<DateTime> 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);
}

然后将 Package Manager Console -> Add-Migration 中的更改添加到数据库(您的更改在此处)

然后在 Package Manager Console -> Update-Database 中运行数据库更新

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

E.G: 17/06/2013 12:00:00 AM

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

于 2013-06-17T04:01:50.957 回答
0

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

于 2013-10-10T11:16:08.210 回答
0

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

于 2015-12-17T21:43:34.817 回答
0

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

我创建了一个继承自 RangeAttribute 的自定义属性来验证日期值。

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 之间。

于 2016-01-13T23:46:55.490 回答
0

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

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

错误的:

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

正确的:

<div class="form-group">
    @Html.LabelFor(model => model.CreatedOn, htmlAttributes: new { @class = "control-label col-lg-3" })
    <div class="col-lg-9">
        @Html.EditorFor(model => model.CreatedOn, new { htmlAttributes = new { @class = "form-control", @readonly="readonly" } })
        @Html.ValidationMessageFor(model => model.CreatedOn, "", new { @class = "text-danger" })
    </div>
</div>
于 2016-01-22T16:45:19.977 回答
0

这篇文章 -在调用 SaveChanges 时使用实体框架解决:“将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围” - 建议使用属性。它为我解决了这个问题。

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public Nullable<System.DateTime> Created { get; set; }
于 2016-02-16T18:10:41.023 回答
0

有点晚了,这个错误让我很沮丧,因为有一天我的代码停止在我的本地主机上工作,但 UAT 服务器上的应用程序很好。当我使用公司网络时,将其跟踪到 Windows 更新,该更新将我的日期区域设置从 yyyy/mm/dd 更改为 dd/mm/yyyy(我正在写入 SQL)。

再次检查您的区域设置是否有任何更改

搜索->设置区域格式->附加日期、时间和区域设置,更新为正确格式

于 2021-05-18T11:16:37.420 回答