C# ';datetime2';在VS 2010.net 4.0中使用实体框架时出错

C# ';datetime2';在VS 2010.net 4.0中使用实体框架时出错,c#,sql-server,entity-framework,sql-server-2008,C#,Sql Server,Entity Framework,Sql Server 2008,获取此错误: System.Data.SqlClient.SqlException:将datetime2数据类型转换为datetime数据类型导致值超出范围 我的实体对象都与DB对象对齐 我通过谷歌只找到了一个关于这个错误的引用: 读完本文后,我记得我们添加了两个字段,然后从VS2010更新了实体模型。我不知道他所说的“手工编码”是什么意思。我没有看到 我在代码中所做的就是填充实体对象,然后保存。(我还在代码中填充新字段)我用DateTime.Now填充日期字段 代码的重要部分是:ctx.Sa

获取此错误:

System.Data.SqlClient.SqlException:将datetime2数据类型转换为datetime数据类型导致值超出范围

我的实体对象都与DB对象对齐

我通过谷歌只找到了一个关于这个错误的引用:

读完本文后,我记得我们添加了两个字段,然后从VS2010更新了实体模型。我不知道他所说的“手工编码”是什么意思。我没有看到

我在代码中所做的就是填充实体对象,然后保存。(我还在代码中填充新字段)我用
DateTime.Now
填充日期字段

代码的重要部分是:
ctx.SaveChanges(SaveOptions.AcceptAllChangesAfterSave)

数据库是SQL Server 2008

想法?

错误的其余部分:

位于System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntITYAAdapter适配器) 位于System.Data.EntityClient.EntityAdapter.Update(EntityStateManager entityCache) 位于System.Data.Objects.ObjectContext.SaveChanges(保存选项) 在SpeciesPost.svc.cs中的SafariAdmin.Site.WebServices.SpeciesPost.SaveOrUpdateSpecies(字符串sid、字符串字段名、字符串身份验证令牌):第58行 在speciesspostsvc_Tester.cs中的SafariAdmin.TestHarness.Tests.Site.WebServices.speciesspostsvc_Tester.SaveNewSpecies()中:第33行 --SqlException 位于System.Data.SqlClient.SqlConnection.OneError(SqlException异常,布尔断开连接) 位于System.Data.SqlClient.SqlInternalConnection.OneError(SqlException异常,布尔断开连接) 位于System.Data.SqlClient.TdsParser.throweexception和warning()处 在System.Data.SqlClient.TdsParser.Run(RunBehavior RunBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj) 位于System.Data.SqlClient.SqlDataReader.ConsumerMetadata()处 在System.Data.SqlClient.SqlDataReader.get_MetaData()处 位于System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds、RunBehavior、String ResetOptions String) 位于System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、Boolean async) 位于System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、String方法、DbAsyncResult) 位于System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、String方法) 位于System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior,String方法) 位于System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior) 位于System.Data.Common.DbCommand.ExecuteReader(CommandBehavior) 在System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator转换器、EntityConnection连接、Dictionary
2标识值、List
1生成值) 位于System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntITYAAdapter适配器)


实体框架将所有日期作为Datetime2处理,因此,如果数据库中的字段是Datetime,这可能是一个问题。
我们在这里也遇到了同样的问题,从我们发现的情况来看,填充所有的日期字段并更改数据类型是最常见的解决方案

适合datetime的任何东西都将适合datetime2数据类型,反之亦然。情况并非如此,您可以在datetime2数据类型中保留1500年1月的日期,但datetime只能追溯到1753年,datetime2列可以一直追溯到第一年。我将检查您传入的最小日期是多少,以及您的表是否有datetime2或datetime数据类型列

使用该SQL脚本将所有列从datetime转换为datetime2
。为方便起见,它跳过所有包含“aspnet”的表

DECLARE @SQL AS NVARCHAR(1024)
DECLARE @TBL AS NVARCHAR(255)
DECLARE @COL AS NVARCHAR(255)
DECLARE @NUL AS BIT

DECLARE CUR CURSOR FAST_FORWARD FOR
    SELECT  SCHEMA_NAME(t.schema_id)+'.'+t.name, c.name, c.is_nullable
    FROM    sys.tables AS t
    JOIN    sys.columns c ON t.object_id = c.object_id
    JOIN    information_schema.columns i ON i.TABLE_NAME = t.name 
                                        AND i.COLUMN_NAME = c.name
    WHERE   i.data_type = 'datetime' and t.name not like '%aspnet%'

    ORDER BY t.name, c.name

OPEN CUR
FETCH NEXT FROM CUR INTO @TBL, @COL, @NUL
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @SQL = 'ALTER TABLE ' + @TBL 
        + ' ALTER COLUMN [' + @COL + '] datetime2' 
        + (CASE WHEN @NUL=1 THEN '' ELSE ' NOT' END) + ' NULL;'
    EXEC sp_executesql @SQL
    FETCH NEXT FROM CUR INTO @TBL, @COL, @NUL
END

CLOSE CUR;
DEALLOCATE CUR;

这对我有用

我知道这是个老问题,但当我在这里搜索时,其他人也可以这样做;-) 对于那些不能从DateTime更改为DateTime2的用户(对于SQL2005用户),我认为在大多数情况下,用类似于
(DateTime)System.Data.SqlTypes.SqlDateTime.MinValue


现在,由于更容易将其识别为“伪空”值(如果需要,将其转换为父对象部分类中的实空值)

实体中是否存在仅在数据库端更新的ModifiedTime属性? 如果是这样,则必须使用DatabaseGenerateOption.Computed(对于EF CodeFirst)。也来看看这个


谢谢。

如果您首先使用代码,则必须将任何可选的DateTime属性声明为DateTime?可为null。取消设置日期时间对象可能会导致问题


如果属性在数据库中为空,并且在代码中为标准的
DateTime
(不是
DateTime?
),ADO.NET将发送日期为0001-01-01(不是
NULL
)的insert命令,但最小SQL DateTime值为1753-01-01,从而导致错误。如果代码中的
DateTime
属性可为空(例如
DateTime?
可为空
),insert命令将尝试插入一个
NULL
而不是超出范围的日期。

在尝试解决此问题几天后,我使用
DateTime?
作为模型中的数据类型,首先使用实体框架代码而不是
DateTime

确保数据库中没有非NULL字段(DateTime)在插入/更新时被忽略。我也有同样的错误,在向这些datetime字段插入值时,问题得到了解决。如果没有为非空datetime字段分配正确的值,就会出现这种情况。

Property(x => x.TheDateTimeField)
   .HasColumnType("datetime2");
public Nullable<System.DateTime> LastLogin { get; set; }
public DateTime? MyDate {get; set;}
context.MyClass.AddOrUpdate(y => y.MyName,new MyClass { MyName = "Random", MyDate= DateTime.Now })
 [Column(TypeName = "datetime2")]
 public DateTime? PropertyName { get; set; }
<Schema Namespace="XXXXX.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008"
cfg.CreateMap<EventViewModel, Event>();
cfg.CreateMap<Event, EventViewModel>()
    .ForMember(dest => dest.CreatedBy, opt => opt.Ignore())
    .ForMember(dest => dest.CreatedDt, opt => opt.Ignore())
    .ForMember(dest => dest.UpdatedBy, opt => opt.Ignore())
    .ForMember(dest => dest.UpdatedDt, opt => opt.Ignore());
cfg.CreateMap<Event, EventViewModel>();
cfg.CreateMap<EventViewModel, Event>()
    .ForMember(dest => dest.CreatedBy, opt => opt.Ignore())
    .ForMember(dest => dest.CreatedDt, opt => opt.Ignore())
    .ForMember(dest => dest.UpdatedBy, opt => opt.Ignore())
    .ForMember(dest => dest.UpdatedDt, opt => opt.Ignore());
[Column(TypeName="datetime2")]