Ошибка «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 ]

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

Entity Framework обрабатывает все даты как Datetime2, поэтому, если ваши поля в базе данных имеют Datetime, это может быть проблемой. У нас была та же проблема, и из того, что мы обнаружили, заполнение всех полей даты и изменение типа данных являются наиболее распространенными решениями

49 голосов
/ 15 июля 2012

Если вы используете Code First, вы должны объявить любое необязательное свойство DateTime как DateTime? или Nullable<DateTime>. Unset DateTime объекты могут вызвать проблемы.

Если свойство имеет значение NULL в базе данных и стандартный DateTime в коде (не DateTime?), ADO.NET отправит команду вставки с датой 0001-01-01 (не NULL) но минимальное значение SQL DateTime - 1753-01-01, что вызывает ошибку. Если ваше свойство DateTime в коде имеет значение NULL (например, DateTime? или Nullable<DateTime>), команда вставки попытается вставить NULL вместо даты вне допустимого диапазона.

13 голосов
/ 16 сентября 2010

Используйте этот сценарий SQL для преобразования всех столбцов с даты / времени в 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;

Это работает для меня!

8 голосов
/ 14 марта 2014

Другое возможное решение - установить тип столбца sql для поля datetime2. это можно сделать с помощью fluentapi.

Property(x => x.TheDateTimeField)
   .HasColumnType("datetime2");

Примечание. Это решение для SQL Server 2008 и выше, так как datetime2 недоступно для SQL Server 2005 и ниже.

7 голосов
/ 29 октября 2015

У меня возникла та же проблема, и я решил ее, поставив атрибут [Column(TypeName = "datetime2")] для связанных свойств, как показано в примере ниже:

 [Column(TypeName = "datetime2")]
 public DateTime? PropertyName { get; set; }
5 голосов
/ 04 апреля 2012

Я знаю, что это старый вопрос, но, как я гуглил здесь, кто-то другой мог бы сделать то же самое ;-) Для тех, которые переходят с DateTime на DateTime2 не вариант (как для пользователей SQL2005), я думаю, что в большинстве случаев более разумно заполнять поля, оставленные пустыми, чем-то вроде (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue
а не с DateTime.now, так как его легче распознать как «псевдо-нулевое» значение (и, если необходимо, преобразовать его в реальный нуль в частичном классе родительского объекта)

3 голосов
/ 13 февраля 2015

При первом использовании кода платформы Entity объявите его следующим образом:

public Nullable<System.DateTime> LastLogin { get; set; }
2 голосов
/ 19 апреля 2016

У нас была такая же проблема.Это было связано с версией mssql.Мы сделали так, чтобы он работал на всех наших версиях с помощью этого метода.

Откройте ваш файл edmx с помощью редактора xml Найдите эту строку вверху вашего файла

<Schema Namespace="XXXXX.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008"

Замените 2008 на 2005Сохраните свой файл, перекомпилируйте проект.

Надеюсь, что это поможет кому-то еще в будущем.

Я пробовал это решение только с подходом dbfirst.

2 голосов
/ 06 апреля 2012

Есть ли в вашей сущности свойство ModifiedTime, которое обновляется только на стороне базы данных? Если это так, вы должны использовать DatabaseGeneratedOption.Computed (для EF CodeFirst). Также посетите этот https://stackoverflow.com/a/9508312/1317263

Спасибо.

1 голос
/ 01 марта 2017

У меня была такая же проблема в моем приложении ASP.Net MVC.

В моем приложении было два класса моделей со свойствами DateTime.

после расследования я заметил, что свойство DateTime одной модели может иметь значение null, т. Е. Сделать его необязательным свойством даты рождения

другая модель имела свойство DateTime с обязательной аннотацией данных (ошибка возникает при сохранении этой модели)

мое приложение сначала кодирует, поэтому я решил проблему, установив тип данных как DateTime2

[Column(TypeName="datetime2")] 

затем я запустил миграцию на консоли диспетчера пакетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...