Я использую API-интерфейсы DbContext и Code First, представленные в Entity Framework 4.1.
Модель данных использует основные типы данных, такие как string
и DateTime
. В некоторых случаях я использую единственную аннотацию данных [Required]
, но это не относится ни к одному из DateTime
свойств. Пример:
public virtual DateTime Start { get; set; }
DbContext подкласс также прост и выглядит следующим образом :
public class EventsContext : DbContext
{
public DbSet<Event> Events { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Event>().ToTable("Events");
}
}
В инициализаторе устанавливает даты в модели до разумных значений в любом в этом году или в следующем году.
Однако, когда я запускаю инициализатор, я получаю эту ошибку в context.SaveChanges()
:
Преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона. Заявление было прекращено.
Я вообще не понимаю, почему это происходит, потому что все так просто. Я также не уверен, как это исправить, так как нет файла edmx для редактирования.
Любые идеи?
источник
Ответы:
Вы должны убедиться, что Start больше или равен SqlDateTime.MinValue (1 января 1753 г.) - по умолчанию Start равен DateTime.MinValue (1 января 0001 г.).
источник
Просто. Сначала в своем коде установите тип DateTime на DateTime ?. Таким образом, вы можете работать с обнуляемым типом DateTime в базе данных. Пример сущности:
источник
В некоторых случаях
DateTime.MinValue
(или эквивалентноdefault(DateTime)
) используется для указания неизвестного значения.Этот простой метод расширения может помочь справиться с такими ситуациями:
Использование:
источник
Вы можете сделать поле обнуляемым, если это соответствует вашим конкретным задачам моделирования. Нулевая дата не будет приведена к дате, которая находится вне диапазона типа SQL DateTime, как значение по умолчанию. Другим вариантом является явное сопоставление с другим типом, возможно, с
источник
Хотя этот вопрос довольно старый и уже есть отличные ответы, я подумал, что должен поставить еще один, который объясняет 3 разных подхода к решению этой проблемы.
1-й подход
Явно сопоставьте
DateTime
свойствоpublic virtual DateTime Start { get; set; }
сdatetime2
соответствующим столбцом в таблице. Потому что по умолчанию EF отобразит его наdatetime
.Это может быть сделано с помощью свободного API или аннотации данных.
Свободный API
В классе DbContext overide
OnModelCreating
и настройте свойствоStart
(для объяснения причин это свойство класса EntityClass).Аннотация данных
2-й подход
Инициализируйте
Start
значение по умолчанию в конструкторе EntityClass. Это хорошо, если по какой-то причине значениеStart
не установлено до сохранения объекта в начале базы данных, всегда будет иметь значение по умолчанию. Убедитесь, что значение по умолчанию больше или равно SqlDateTime.MinValue (с 1 января 1753 по 31 декабря 9999)3-й подход
Сделать,
Start
чтобы быть типа обнуляемым-DateTime
примечание?
послеDateTime
-Для более подробного объяснения прочитайте этот пост
источник
Если ваши
DateTime
свойства могут быть обнулены в базе данных, убедитесь, что вы используете ихDateTime?
для свойств связанного объекта, или EF передастDateTime.MinValue
неназначенные значения, которые находятся за пределами диапазона, который может обрабатывать тип datetime SQL.источник
Моим решением было переключить все столбцы datetime на datetime2 и использовать datetime2 для любых новых столбцов. Другими словами, заставьте EF использовать datetime2 по умолчанию. Добавьте это к методу OnModelCreating в вашем контексте:
Что получит все DateTime и DateTime? свойства на всех ваших лиц.
источник
инициализировать свойство Start в конструкторе
Это сработало для меня, когда я пытался добавить несколько новых полей в таблицу Users (AspNetUsers) ASP .Net Identity Framework, используя Code First. Я обновил Class - ApplicationUser в IdentityModels.cs и добавил поле lastLogin типа DateTime.
источник
Исходя из ответа пользователя @ andygjp, лучше, если вы переопределите базу
Db.SaveChanges()
метод и добавите функцию для переопределения любой даты, которая не попадает между SqlDateTime.MinValue и SqlDateTime.MaxValue.Вот пример кода
Взято из комментария пользователя @ sky-dev на https://stackoverflow.com/a/11297294/9158120
источник
У меня была та же проблема, и в моем случае я устанавливал дату для нового DateTime () вместо DateTime.Now
источник
В моем случае это произошло, когда я использовал entity и таблица sql имеет значение по умолчанию datetime == getdate (). так что я сделал, чтобы установить значение для этого поля.
источник
Сначала я использую базу данных, и когда со мной произошла эта ошибка, я решил использовать ProviderManifestToken = "2005" в файле edmx (чтобы модели были совместимы с SQL Server 2005). Не знаю, возможно ли что-то подобное для Code First.
источник
Одна строка исправляет это:
Итак, в своем коде я добавил:
Добавление этой строки в переопределение подкласса DBContext void OnModelCreating должно работать.
источник
В моем случае после некоторого рефакторинга в EF6 мои тесты не прошли с тем же сообщением об ошибке, что и у исходного постера, но мое решение не имело ничего общего с полями DateTime.
Я просто пропустил обязательное поле при создании объекта. Как только я добавил недостающее поле, ошибка исчезла. У моей сущности есть два DateTime? поля, но они не были проблемой.
источник