Kyl*_*yle 4 c# asp.net-mvc sql-server-2008
我制作了一个小型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
Run Code Online (Sandbox Code Playgroud)
如果我尝试注册一个帐户.我尝试将所有smalldatetimecolumns转换为datetime2列但由于某种原因,即使没有smalldatetimes,也会发生相同的错误?
有没有人有任何想法?谢谢.
编辑:未来的人 - 我不确定为什么修复它,但我在SQL Express 2008而不是SQL 2012中重新创建了表,然后将它们移动了.工作得很好.
Tim*_*ong 12
从错误的外观来看,您的数据库使用SmallDateTime作为日期类型.它的最小值是1900年1月1日.假设您的实体如下所示
public class Game
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid GameId { get; set; }
[Required]
public DateTime GameTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您的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");
}
Run Code Online (Sandbox Code Playgroud)
编写转换器帮助程序以设置DateTime属性最小值以匹配应用程序中的smalldatetime.
在数据库中写入一个触发器,将DateTime2(从应用程序端,但在数据库端的datetime2)转换为smalldatetime.
希望我能正确理解你的问题,我的回答很有帮助.
归档时间: |
|
查看次数: |
16317 次 |
最近记录: |