5

我制作了一个小型 MVC4 应用程序并在我的本地 SQL 2012 服务器上制作了数据库。“导入”了我 2012 年的数据,将其作为 sql 2008 的生产数据转移到我的廉价共享主机中。一切正常。对非 aspmembership 表进行了一些更改,并从 sql 2008 中删除了表并重新导入。不是出于某种原因我收到此错误

The conversion of a datetime2 data type to a smalldatetime data type resulted in an out-of-range value.\r\nThe statement has been terminated

如果我尝试注册一个帐户。我尝试将所有 smalldatetimecolumns 更改为 datetime2 列,但由于某种原因,即使没有 smalldatetimes,也会出现相同的错误?

有没有人有任何想法?谢谢你。

编辑:未来的人-我不确定为什么要修复它,但是我在 SQL express 2008 而不是 SQL 2012 中重新创建了表,然后将它们移了过来。工作正常。

4

1 回答 1

13

从错误的外观来看,您的数据库使用 SmallDateTime 作为日期类型。它的最小值是 1900-Jan-01。假设您的实体如下所示

  public class Game
  {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid GameId { get; set; }

    [Required]
    public DateTime GameTime { get; set; }
  }

您的 GameTime 值不可为空,因此当您不为其设置任何值时,它将始终是 DateTime.Min,即 0000-Jan-01。这超出了 SmallDateTime 的范围,但在 DateTime2 的范围内。因此 EF 将尝试将 DateTime2 SQL 类型传递给 SQL 服务器。因为您的数据库使用的是 SmallDateTime,所以您将收到问题中显示的错误。

要解决此问题,您有以下我能想到的选项:

  • 使字段为空。(您必须始终检查您的输入日期是否在 SmallDateTime 范围内。)

  • 或在 SQL Server 中将日期类型更改为 DateTime2

  • 或在创建数据库时强制 EF 使用 DateTime2 数据类型。代码将如下所示。(这个方法应该在你的上下文类中。)


  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(t => t.GameTime )
            .HasColumnType("datetime2");
    }
  • 编写转换器助手来设置您的 DateTime 属性最小值以匹配应用程序中的 smalldatetime。

  • 在数据库中编写一个触发器,将 DateTime2(从应用程序端,但在数据库端的 datetime2)转换为 smalldatetime。

希望我已经正确理解了您的问题,并且我的回答会有所帮助。

于 2013-04-29T05:44:01.007 回答