我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。

保存时,返回一个错误:

将datetime2数据类型转换为datetime数据类型会导致值超出范围

它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。

date列设置为DateTime,如下所示:

新数据专栏(“myDate, Type.GetType”)

问题

是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?


当前回答

实体框架4使用datetime2数据类型,因此在数据库中对应的字段必须是datetime2的SQL Server 2008。

要解决这个问题,有两种方法。

要在实体框架4中使用datetime数据类型,你必须将edmx文件中的ProviderManifestToken切换为“2005”。 如果你设置相应的字段为允许空(它转换为NULLABLE),那么EF自动使用日期对象作为datetime。

其他回答

继承的datetime属性有问题

当不可为空的日期字段在插入/更新时值为null时,通常会显示此错误消息。其中一个原因可能是遗传。

如果你的日期是从基类继承的,你不做映射EF将不会读取它的值。

欲了解更多信息: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines

对我来说,我有一个Devexpress DateEdit组件,它通过nullable model属性绑定到可空的datetime MSSQL列。我所要做的就是在DateEdit上设置AllowNullInput = True。将其设置为“默认”会导致日期1.1.0001出现-仅在离开DateEdit之前-然后由于上面提到的后续指示,我得到了此转换错误消息。

简短的回答

如果没有初始化DateTime字段的值,就会发生这种情况;该字段不接受NULL值,并且它是一个值类型,因此将使用不可空的DateTime类型的默认值。

设置值固定它为我!

长回答

默认值(DateTime)为DateTime。MinValue(或新的DateTime(1,1,1)或01/01/0001),这不是一个有效的SQL日期时间值。

由于使用的是公历,SQL Server datetime的最低有效值是01/01/1753。但是SQL Server DateTime2支持从01/01/0001开始的日期。实体框架默认使用DateTime2来表示日期,因此生成的SQL隐式地将生成的DateTime2值强制转换为SQL服务器端的DateTime值。

看看下面两个: 1)该字段没有NULL值。例如:

 public DateTime MyDate { get; set; }

替换:

public DateTime MyDate { get; set; }=DateTime.Now;

2)重新创建数据库。例如:

db=new MyDb();

如果我们不传递一个日期时间到日期时间字段,默认日期{1/1/0001 12:00:00 AM}将被传递。

但是这个日期与实体框架工作不兼容,所以它会抛出 将datetime2数据类型转换为datetime数据类型会导致值超出范围

只需要默认DateTime。如果您没有传递任何日期,那么现在进入日期字段。

movie.DateAdded = System.DateTime.Now