我制作了一个小型MVC4应用程序并在我的本地SQL 2012服务器上创建了数据库。 “导入”我2012年的数据将其移至我的廉价共享主机作为sql 2008的生产。一切正常。对sql 2008中的非aspmembership表和已删除的表进行了一些更改并重新导入。 不是出于某种原因我得到这个错误
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中重新创建表,然后将它们移动过来。工作得很好。
答案 0 :(得分:12)
从错误的角度看,您的数据库使用SmallDateTime作为日期类型。它的最小值是1900年1月1日。假设您的实体如下所示
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,因此您将收到问题中显示的错误。
要解决此问题,您可以考虑以下选项:
让这个领域成为nullalbe。 (您必须始终检查输入日期是否在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。
希望我能正确理解你的问题,我的回答会有所帮助。