将datetime2数据类型转换为smalldatetime EF6 MVC5

时间:2017-05-13 00:23:33

标签: sql entity-framework-6 type-conversion asp.net-mvc-5

我首先使用MVC5和EF6代码。我有一个表,其中两个表格(Kommunication和Itemannounce)中的日期(基准)列具有smalldatetime类型,当我尝试使用System.DateTime.Now在列中设置日期时,我得到以下错误:

  

将datetime2数据类型转换为smalldatetime数据类型   导致超出范围的价值。声明已被终止。

我知道字节大小,并在我的上下文中尝试了以下解决方案:

  protected override void OnModelCreating( DbModelBuilder modelBuilder )
        {
        var annons = modelBuilder.Entity<Itemannounce> ( );
        annons.Property ( f => f.Datum ).HasColumnType ( "smalldatetime" );
        var komm = modelBuilder.Entity<Kommunication> ( );
        komm.Property ( f => f.Date ).HasColumnType ( "smalldatetime" );
        base.OnModelCreating ( modelBuilder );
        }

我仍然得到同样的错误。我试图将列设置为NOT NULL而没有任何运气。几天之后,我真的陷入了困境,没有找到解决方法。有没有人有解决方案我还没试过?

1 个答案:

答案 0 :(得分:0)

smalldatetime的最小值为1900-01-01

datetime2的最小值为0000-01-01

据推测,这里发生的是我们将datetime2值传递给smalldatetime列。当没有提供datetime2并且它是NON NULL时,它将默认为0000-01-01的最小值。这远远低于smalldatetime的底线。它是出界的。插入smalldatetime范围之外的值将产生您收到的错误消息。

  

将datetime2数据类型转换为smalldatetime数据类型   导致超出范围的价值。声明已被终止。

有很多方法可以解决这个问题。我建议更新模型以使用datetime2。

 protected override void OnModelCreating( DbModelBuilder modelBuilder )
        {
        var annons = modelBuilder.Entity<Itemannounce> ( );
        annons.Property ( f => f.Datum ).HasColumnType ( "datetime2" );
        var komm = modelBuilder.Entity<Kommunication> ( );
        komm.Property ( f => f.Date ).HasColumnType ( "datetime2" );
        base.OnModelCreating ( modelBuilder );
        }

如果您不想更改模型,那么NULL检查也可以正常工作。 This similar question应该给你一些想法。