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

时间:2013-04-30 11:19:01

标签: c# asp.net-mvc entity-framework datetime

我有一个控制器:

[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数据类型转换为日期时间数据类型会导致超出范围的值。

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

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

10 个答案:

答案 0 :(得分:22)

错误是因为您还没有正确设置这些值,请确保根据应用程序区域设置来设置它们。 (例如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; }

答案 1 :(得分:13)

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

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

public DateTime? MyDateTime { get; set; }

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

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

或只是为它分配一个值,就像没有发生任何事情一样......

MyDateTime = DateTime.Now;

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

我也遇到了这个问题。

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

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

可以从 - &gt;找到程序包管理器控制台。工具 - &gt;库包管理器 - &gt;包管理器控制台

我在软件包管理器控制台中启用了数据库迁移 - &gt;启用的迁移

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

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);
}

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

然后在软件包管理器控制台中运行数据库更新 - &gt;更新数据库

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分: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。

答案 7 :(得分:0)

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

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

错误:

<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>

答案 8 :(得分:0)

这篇文章 - Solution to: “The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value” with Entity Framework when calling SaveChanges - proposes to use the attribute。它为我解决了这个问题。

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

答案 9 :(得分:0)

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

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

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