我有一个控制器:
[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
字段的格式是什么,所以我不会有这个错误?
答案 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)
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public Nullable<System.DateTime> Created { get; set; }
答案 9 :(得分:0)
有点晚了,这个错误让我沮丧了好几个小时,因为有一天我的代码在我的本地主机上停止工作,但 UAT 服务器上的应用程序很好。当我使用公司网络时,将其追溯到 Windows 更新,该更新将我的日期区域设置从 yyyy/mm/dd 更改为 dd/mm/yyyy(我正在写入 SQL)。
再次检查您的区域设置是否有任何更改
搜索->设置区域格式->其他日期、时间和区域设置,更新为正确的格式