Ошибка «datetime2» при использовании платформы сущностей в VS 2010 .net 4.0 - PullRequest
60 голосов
/ 27 августа 2010

Получение этой ошибки:

System.Data.SqlClient.SqlException: преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона.

Все объекты моей сущности совпадают с объектами БД.

Я нашел только одну ссылку на эту ошибку через Google:

Результат Google

Прочитав это, я помню, что мы сделали , добавили 2 поля и затем обновили модель сущности из VS 2010. Я не уверен, что он подразумевает под "ручным кодированием" различий. Я ничего не вижу.

Все, что я делаю в коде, - это заполнение объекта-сущности, а затем сохранение. (Я также заполняю новые поля в коде) Я заполнил поле даты с помощью DateTime.Now ..

Важной частью кода является: ctx.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

База данных SQL Server 2008.

Мысли

Остальная часть ошибки:

в System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager, адаптер IEntityAdapter) в System.Data.EntityClient.EntityAdapter.Update (IEntityStateManager entityCache) в System.Data.Objects.ObjectContext.SaveChanges (параметры SaveOptions) в SafariAdmin.Site.WebServices.SpeciesPost.SaveOrUpdateSpecies (String sid, String fieldName, String authToken) в SpeciesPost.svc.cs: строка 58 в SafariAdmin.TestHarness.Tests.Site.WebServices.SpeciesPostSVC_Tester.SaveNewSpecies () в SpeciesPostSVC_Tester.cs: строка 33 --SqlException в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () в System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) в System.Data.SqlClient.SqlDataReader.ConsumeMetaData () в System.Data.SqlClient.SqlDataReader.get_MetaData () в System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, логический асинхронный) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод String, результат DbAsyncResult) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический 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, словарь 2 identifierValues, List 1 генерируемых значений) в System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager, адаптер IEntityAdapter)

Ответы [ 16 ]

1 голос
/ 08 января 2014

Убедитесь, что ни одно из ненулевых полей в БД (datetime) не пропущено при вставке / обновлении.У меня была та же ошибка, и при вставке значений в эти поля даты и времени проблема была решена. Это происходит, если ненулевым полям даты и времени не присвоено правильное значение.

1 голос
/ 17 сентября 2013

После попытки решить эту проблему в течение нескольких дней я использовал DateTime? в качестве типа данных в моей модели с Entity Framework Code-First вместо DateTime.

1 голос
/ 27 августа 2010

Независимо от того, что вписывается в datetime, будет соответствовать типу данных datetime2, наоборот, это не так, вы можете прикрепить дату 1500 января к типу данных datetime2, но datetime возвращается только к 1753, столбец datetime2 может идти обратно до года 1. Я бы проверил, какую минимальную дату вы передаете, и есть ли в ваших таблицах столбцы с типом данных datetime2 или datetime

0 голосов
/ 01 августа 2016

Это следует из ответа stepanZ ... Я получил эту ошибку при использовании Entity Framework Code First с AutoMapper.

При настройке AutoMapping у нас есть поля createddt, updateddt, createdby и updatedby, которые автоматически устанавливаются в нашей функции public override int SaveChanges().При этом вы должны убедиться, что вы задали эти поля, чтобы они игнорировались AutoMapper, в противном случае база данных будет обновлена ​​с null для тех полей, если они не предоставлены из View.

Myпроблема заключалась в том, что я неправильно указал источник и назначение, поэтому пытался игнорировать поля при установке ViewModel, а не при установке Model.

Mapping выглядело таккогда я получил эту ошибку (примечание: cfg.CreateMap<Source, Destination>() во второй строке отображает Model на ViewModel и устанавливает Ignore())

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());

Источник и пункт назначения должны игнорироватьсядля сопоставления от ViewModel до Model (примечание: приведенный ниже код является верным, когда Ignore() помещен против сопоставления для ViewModel в Model)

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());
0 голосов
/ 11 мая 2015

Simple. Сначала в вашем коде установите тип DateTime на DateTime ?. Таким образом, вы можете работать с обнуляемым типом DateTime в базе данных.

0 голосов
/ 18 февраля 2015

Два решения:

  • Объявите свойства в своем классе, как показано ниже, и создайте базу данных обновлений:

    public DateTime? MyDate {get; set;}
    
  • Или установитедата для свойства в методе Seed, который заполняет базу данных, нет необходимости в update-database:

    context.MyClass.AddOrUpdate(y => y.MyName,new MyClass { MyName = "Random", MyDate= DateTime.Now })
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...