C# DateTime出现问题(转换datetime2数据类型会导致超出范围)

C# DateTime出现问题(转换datetime2数据类型会导致超出范围),c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我得到这个错误: “将datetime2数据类型转换为datetime数据类型导致值超出范围。语句已终止。” 与用户交互的视图具有以下相关代码: @Html.LabelFor(model => model.BirthDate) @Html.TextBoxFor(model => model.BirthDate, new { size = "50", @type = "date", @class = "AddMemberControls" }) 用户必须在其中输入日期的文本框中显示“

我得到这个错误:

“将datetime2数据类型转换为datetime数据类型导致值超出范围。
语句已终止。”

与用户交互的视图具有以下相关代码:

@Html.LabelFor(model => model.BirthDate)
@Html.TextBoxFor(model => model.BirthDate, new { size = "50", @type = "date", @class = "AddMemberControls" })
用户必须在其中输入日期的文本框中显示“mm/dd/yyyy”(并显示一个日历,用户可以在其中选择日期)

控制器方法如下所示:

public ActionResult AddMember(string firstName, string lastName, DateTime birthDate, int age, string sportType)
{            
    var member = new Member() { FirstName = firstName, LastName = lastName, Age = age, SportType = sportType, BirthDate = birthDate };

    coloContext.Members.Add(member);
    coloContext.SaveChanges();  

    return View();
}
和型号:

[Column(TypeName = "datetime2")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime BirthDate { get; set; } 

例如,如果用户选择日期
05/01/18
,则在调试和检查生日参数时,会显示
01-May-18 12:00:00 AM

我想问题是它写的是“May”,而数据库不知道如何保存它

我在互联网上看到了很多关于这个问题的信息,并尝试了几次解决方案,但不幸的是,这两种方法都对我不起作用

我试过:

添加带有列typename的批注

[Column(TypeName = "datetime2")]
在我的模型中创建Datime nullabe(有几种解决方案建议)。但这个解决方案对我来说没有多大意义。特别是当我知道这个参数不能为空时

public DateTime? BirthDate { get; set; }
试图解析DateTime,希望它能去掉“May”。如果可能的话,我想把日期保存成那种格式

DateTime test = DateTime.parse(birthDate.ToString())
有些人建议更改为DateTime2,但没有名为DateTime2的对象?我还是试过了,但还是出了个错误

public DateTime2 BirthDate { get; set; }

还有一些我忘记的其他解决方案。

从错误消息中可以清楚地看出,实际数据库表中的数据类型不是but

这些数据类型在可接受范围内不同(除其他外)

DateTime2
的可接受范围为
0001-01-01
9999-12-31

(1999年1月1日至12月31日) 而
DateTime
的可接受范围仅为
1753-01-01
9999-12-31

(1753年1月1日至9999年12月31日)。(奖金如下:)

您应该停止使用
DateTime
而改用
Date
Time
DateTime2
的原因有很多-

因此,要解决此问题,请将数据库列的数据类型从
DateTime
更改为
DateTime2
。这可以通过一个简单的
altertable
dml语句来完成:

ALTER TABLE YourTable
    ALTER COLUMN col DateTime2;

2018年5月1日12:00:00 AM
就是这样向您展示的。错误消息表示您发回的值不在有效范围内,我假设您的
DateTime birthDate
01/01.0001
(您为什么不绑定到您的模型)此错误消息可能是由于
出生日期
被设置为默认日期时间值0001-01-01。如果值为2018年1月5日,则不会出现此错误。但是,不是绑定到模型,而是传递参数。也许你有错误,你没有提供设置这些参数的代码。绑定到模型是最简单的事情。我不知道你们说的“绑定到模型”是什么意思?我在不到两周前才开始使用asp.net mvc,所以我只是初学者。您的POST方法应该是
public ActionResult AddMember(xxx model)
其中
xxx
是您在视图中使用的模型您也提到了DateTime2:-),但不存在这样的模型吗?我无法使用它,也找不到它的命名空间?它不是.Net类型,而是SQL Server类型。我已经编辑了我的答案以提供官方文档的链接。谢谢@Zohlar Peled。我想知道。因为我使用的是EF代码优先的方法,所以每次我从头开始创建DB时是否都必须更改列?@MOR_SNOW,不,你的问题不在这里。Datetime可以正常工作,除非您需要存储早于1753年的日期。