将datetime2数据类型转换为日期时间为1753/1/1

时间:2018-11-06 17:30:18

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

我已经向我的客户模型添加了属性,创建了迁移并更新了数据库。在数据库中创建的字段为 datetime 。 这是我的模型代码

public DateTime BirthDate { get; set; }

这实际上是一种表格,我在其中插入日期和其他字段并提交表格。

<div class="form-group">
    @Html.LabelFor(m => m.Customer.BirthDate)
    @Html.TextBoxFor(m => m.Customer.BirthDate, "{0: dd-MM-yyyy}", new { @class = "form-control" })
</div>

这是控制器中的动作

     public ActionResult Save(Customer customer)
    {
        if (customer.Id == 0)
        {
            _context.Customers.Add(customer);
        }
        else
        {
            var customerInDb = _context.Customers.Single(c => c.Id == customer.Id);
            customerInDb = customer;
        }
        _context.SaveChanges();
        return RedirectToAction("Index", "Customers");
    }

我已将1976年4月23日的BirthDate字段进行了批处理,并调试了该应用程序并检查了customer.BirthDate的值,该时间为1976年4月23日上午12:00:00。日期是1753/1/1之前的注释,但我收到上述例外。

我也尝试了以下方法: 通过

使该字段为空
public DateTime? BirthDate { get; set; }

例外消失了,但是日期没有保存到数据库中。

从视图中删除了队友“ {0:dd-MM-yyy}”,但徒劳无功。

插入日期的格式不同,例如1952年4月23日,1985-12-01和1987/1/2,但无效。

Visual Studio 2013和数据库是Visual Studio的 LocalDb

2 个答案:

答案 0 :(得分:0)

通过使该属性可为空而消除错误的事实给出了答案。如果设置了一个,那么您将得到与该字段不可可为空的完全相同的错误。

因此,未设置该值,如果该字段可为空(则确认您说它不存储该值,而是存储为空),则该值存储为空。

因此,对于一个不可为空的属性,如果未设置该属性,它将具有一个点网DateTime的默认值DateTime.MinValue,如果存储在一个SQL服务器datetime2,而不是datetime中的SQL服务器,您将在其中收到1753错误。

顺便说一句,我假设此LocalDb实际上是基于1753错误的SQL Server。作为记录,在SQL Server中,您应该使用datetime2:DateTime2 vs DateTime in SQL Server

但是此字段实际上是一个日期,因此您应该使用date SQL类型。

因此,总而言之,我怀疑传递给Save方法的Customer中的BirthDate值具有值DateTime.MinValue。现在您需要找出原因...(但这是一个不同的问题)

P.S。您是否故意使用dd-MM-yyy?是否应该再添加y

答案 1 :(得分:0)

实际问题出在DateTime viewmodel属性和此TextBoxFor助手中:

@Html.TextBoxFor(m => m.Customer.BirthDate, "{0: dd-MM-yyy}", new { @class = "form-control" })

根据当前区域性设置,这将生成具有指定日期格式的纯输入,该日期格式可能与服务器中的当前区域性设置不匹配,这将导致默认模型绑定程序忽略其值,并使用DateTime.MinValue作为默认值(因为它不是可为null的类型),不适用于最小值为datetime的SQL中的1753-01-01列类型(T-SQL中System.DateTime的等效类型为{{1 }}。

datetime2属性创建输入助手的最推荐设置是使用DateTime设置为DataTypeAttributeDataType.Date来指定格式字符串:

DisplayFormatAttribute

然后,将[DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime BirthDate { get; set; } EditorForTextBoxFor属性一起使用以生成日期输入:

type="date"

注意::与上述相同的设置也适用于@* TextBoxFor *@ @Html.TextBoxFor(model => model.Customer.BirthDate, new { @class = "form-control", type = "date" }) @* EditorFor *@ @Html.EditorFor(model => model.Customer.BirthDate, new { htmlAttributes = new { @class = "form-control" } }) / Nullable<DateTime>属性。

另外,您应该在使用DateTime?之前检查IsValid的{​​{1}}属性,并在验证失败时返回相同的视图:

ModelState

相关问题:ASP.NET MVC date not saving when posting