我首先使用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而没有任何运气。几天之后,我真的陷入了困境,没有找到解决方法。有没有人有解决方案我还没试过?
答案 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应该给你一些想法。