2015-09-27 1 views
0

Я знаю, что этот вопрос задавали несколько раз в StackOverflow, но ни один из ответов не соответствует моей ситуации, или они просто говорят им разрешать поля NULL в их DateTime (чего я не хочу делать).Ошибка SaveChangesAsync: преобразование DateTime2 в DateTime вне диапазона

Вот код:

public async Task<int> CreateJobAsync(JobViewModel jvm) 
    { 
     Job j = new Job(); 
     j.Name = jvm.Name; 
     j.UserId = jvm.UserId; 
     j.ClassDefinition = jvm.ClassDefinition; 
     j.DaysToRun = jvm.DaysToRun; 
     j.ToEmail = jvm.ToEmail; 
     j.Active = true; 
     j.CreatedDate = DateTime.Now; 
     j.ModifiedDate = DateTime.Now; 

     context.Jobs.Add(j); 
     var result = await context.SaveChangesAsync(); 

     return result; 
    } 

Все мои поля в Job класса DateTime как и объект в базе данных. Значения даты не являются NULL. Когда я запускаю Sql Profiler, он даже не показывает, что был вызван вызов базы данных.

Ошибка происходит на await вызова и это:

conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value

Это кажется довольно простой пример, и мне нужно эти значения, чтобы быть not null. Любые другие идеи ???

ответ

2

Там должны быть и другие поля (ы) в Job, которые имеют тип DateTime, которые не установлен в вашем коде. Это свойство unset будет по умолчанию равно DateTime.MinValue, которое составляет 1 января-0001. Тип SQL DATETIME поддерживает только даты с годом, превышающим 1752. Следовательно, причина вашего исключения.

Проще всего изменить базу данных, чтобы использовать DATETIME2, а не DATETIME. См. Также DateTime2 vs DateTime in SQL Server

+0

Позвольте мне поработать над этим. Увидев ваш ответ, я просмотрел Job.cs, и внутри него есть еще один класс. И в этом классе THAT есть DateTime. –

+0

Вот и все. Класс, на который ссылается внутри Job, имел DateTime, который по умолчанию использовал DateTime.MinValue. Благодаря! –

2

DateTime - это тип значения в .Net и никогда не будет равным null.

Теперь, как говорится, что значение по умолчанию для DateTime в C# которое равно 01/01/0001DateTime.MinValue, и все поля DateTime получить это значение по умолчанию, если не указано иное! Но эта дата из SQLServer диапазонов дат, для которых минимальная дата - 1/1/1753. Вероятно, именно поэтому вы получаете это исключение.

Один из способов сделать код полезным - это использовать SqlDateTime.MinValue вместо DateTime.MinValue.

+0

В моем коде я устанавливаю значения DateTime.Now, и я даже пробовал жесткую кодировку сегодняшней даты, но все равно получаю ту же ошибку. Я не уверен, почему он будет использовать DateTime.MinValue. Точка, никогда не получающая нулевое значение, действительна, поэтому я попытаюсь изменить мою базу данных. –

+0

@ L_7337 Где-то в коде некоторое поле datetime может быть не инициализировано или плохо отформатировано. Существует множество способов противостоять этому - пожалуйста, ищите SO с «преобразованием типа данных datetime2 в тип данных datetime, результатом которого является значение вне диапазона» для нескольких существующих ответов. –