ошибка "datetime2" при использовании Entity framework в VS 2010.net 4.0
получаю эту ошибку:
система.Данные.SqlClient.SqlException: преобразование типа данных datetime2 в тип данных datetime привело к значению вне диапазона.
мои объекты все объекты БД.
Я нашел только одну ссылку на эту ошибку через 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)
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