C# “如何修复”;SqlException:将datetime2数据类型转换为datetime数据类型导致值超出范围。”;

C# “如何修复”;SqlException:将datetime2数据类型转换为datetime数据类型导致值超出范围。”;,c#,asp.net,entity-framework,webforms,C#,Asp.net,Entity Framework,Webforms,SqlException:将datetime2数据类型转换为datetime数据类型导致值超出范围 我的代码如下: using (var contxt = new realtydbEntities()) { var status = GetStatus(); var repIssue = new RepairIssue() { CreaterId = Auth

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

我的代码如下:

        using (var contxt = new realtydbEntities())
        {
            var status = GetStatus();

            var repIssue = new RepairIssue()
            {
                CreaterId = AuthorId,
                RepairItemDesc = this.txtDescription.Text,
                CreateDate = DateTime.Now,//here's the problem
                RepairIssueStatu = status
            };

            contxt.AddObject("RepairIssues", repIssue);
            contxt.SaveChanges();
        }
CreateDate属性映射到类型为smalldatetime的列


如何运行此代码?

将允许您执行所需操作。

问题的根源在于C#DateTime对象比SQL的smalldatetime类型“大”。下面是对这些差异的一个很好的概述:

因此,您真正的选择是:

  • 将列类型从smalldatetime更改为datetime(或datetime2)
  • 不要使用EF,而是构造自己的SQL命令(并且可以使用SqlDateTime)

  • 我也有同样的例外,但这是因为一个不可为null的datetime属性接受了min datetime值。在DB中这不是一个很小的datetime,但是C#的min datetime超过了SQL的min datetime限制。 解决方案显而易见,正确设置日期时间。
    顺便说一句,代码不是我的,这就是我不知道该属性的原因:)

    我出现此错误是因为我在SQL表和应用程序中添加了datetime列,而没有删除旧数据。我发现我可以更新新的记录;但是,当尝试对其中一条记录进行更新时,添加字段之前的表中的记录引发了此错误。

    将此添加到模型类:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
        }
    
    模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
    {
    modelBuilder.Properties().Configure(c=>c.HasColumnType(“datetime2”);
    }
    
    检查迁移内容。我这样改变了我的模型”

    公共日期时间?CreationDate{get;set;}


    然后添加新的迁移并最终运行更新数据库

    这并不能解释为什么
    DateTime.Now将
    不适合SmallDateTime。这与大小无关,而是与它可以存储的范围和精度/精确度有关。
    DateTime。现在
    应该始终是SmallDateTime字段的有效值(除非你将你的电脑时钟设置回300年),但是,我目前在尝试将{04/10/2013 12:49:00}的'DateTime.Now'值保存到SQL SmallDateTime字段时遇到了完全相同的错误。令人沮丧的是,我在任何地方都找不到正确的答案。@TrueBlueAusie自动将“较大”类型转换为不允许使用较小的“类型”,因为信息可能会在转换过程中丢失。“较大”表示“可以容纳更大的数字”或“可以容纳更高的精度”。C#假设这些小数秒很重要,除非您明确表示它们不重要(例如,使用显式强制转换)@GrandOpener:很抱歉,你误解了我的评论。我只是想说答案应该解释为什么dateTime.Now不适用于SmallDateTime。我不是要求解释:)如果你按照你的建议从
    dateTime
    创建
    SqlDateTime
    ,那么使用它的
    值进行EF更新(因为EF属性是DateTime)您仍然会得到完全相同的错误(如果您有此错误)。除非您能够澄清这是如何解决问题的,否则此答案对于EF(问题是关于EF的)来说似乎不正确。您如何正确设置日期时间的可能重复?