ошибка "datetime2" при использовании Entity framework в VS 2010.net 4.0



получаю эту ошибку:




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




мои объекты все объекты БД.



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



результате Google



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



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



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



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



мысли?



остальное об ошибке:




в систему.Данные.Отображение.Обновление.Внутренний.UpdateTranslator.Обновление (ientitystatemanager stateManager, адаптер IEntityAdapter)
в системе.Данные.поставщик EntityClient.EntityAdapter.Обновление (ientitystatemanager entityCache)
в системе.Данные.Объекты.Контекст objectcontext.SaveChanges(параметры SaveOptions)
в SafariAdmin.Сайт.Веб-сервисы.SpeciesPost.SaveOrUpdateSpecies (String sid, String fieldName, String authToken) в SpeciesPost.ВПВ.cs: линия 58
на Сафариадмин.TestHarness.Тесты.Сайт.Веб-сервисы.SpeciesPostSVC_Tester.SaveNewSpecies () в SpeciesPostSVC_Tester.cs: линия 33
--Исключение sqlexception
в системе.Данные.SqlClient.Объект sqlconnection.OnError (исключение SqlException, логическое breakConnection)
в системе.Данные.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection)
в системе.Данные.SqlClient.TdsParser.ThrowExceptionAndWarning()
в системе.Данные.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
в системе.Данные.SqlClient.SqlDataReader.ConsumeMetaData()
в системе.Данные.SqlClient.SqlDataReader.не get_metadata()
в системе.Данные.SqlClient.Свойство sqlcommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
в системе.Данные.SqlClient.Свойство sqlcommand.RunExecuteReaderTds(метода commandbehavior cmdBehavior, RunBehavior runBehavior, логическое returnStream, логическое асинхронного)
на Система.Данные.SqlClient.Свойство sqlcommand.RunExecuteReader(метода commandbehavior cmdBehavior, RunBehavior runBehavior, логическое returnStream, метод String, DbAsyncResult результат)
в системе.Данные.SqlClient.Свойство sqlcommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, строковый метод)
в системе.Данные.SqlClient.Свойство sqlcommand.ExecuteReader(CommandBehavior поведение, строковый метод)
в системе.Данные.SqlClient.Свойство sqlcommand.ExecuteDbDataReader(CommandBehavior поведение)
на Система.Данные.Общий.Объектов dbcommand.ExecuteReader(CommandBehavior поведение)
в системе.Данные.Отображение.Обновление.Внутренний.DynamicUpdateCommand.Выполнить (UpdateTranslator translator, EntityConnection connection, Dictionary2 identifierValues, List1 generatedValues)
в системе.Данные.Отображение.Обновление.Внутренний.UpdateTranslator.Обновление (ientitystatemanager stateManager, адаптер IEntityAdapter)


717   16  

16 ответов:

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

если вы используете код, сначала вы должны объявить любые дополнительные DateTime имущество в виде DateTime? или Nullable<DateTime>. Сбросьте DateTime объекты могут вызвать проблемы.

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

используйте этот скрипт 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;

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

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

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

Примечание: это решение для sql server 2008 вверх, как datetime2 не доступен для sql server 2005 или ниже.

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

 [Column(TypeName = "datetime2")]
 public DateTime? PropertyName { get; set; }

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

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

public Nullable<System.DateTime> LastLogin { get; set; }

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

спасибо.

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

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

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

заменить 2008 на 2005 год Сохраните файл, перекомпилируйте проект.

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

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

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

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

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

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

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

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

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

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

[Column(TypeName="datetime2")] 

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

простой. На свой код во-первых, установить тип datetime в тип datetime?. Так что вы можете работать с типом nullable datetime в базе данных.

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

при создании AutoMapping у нас есть createddt,updateddt,createdby и updatedby поля, которые автоматически устанавливаются в нашем

два решения:

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

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

    context.MyClass.AddOrUpdate(y => y.MyName,new MyClass { MyName = "Random", MyDate= DateTime.Now })
    

Comments

    Ничего не найдено.