Переполнение произошло при преобразовании в datetime с использованием EF4
У меня есть приложение Windows, работающее с базой данных SQL Compact 4.0, с использованием EF 4.1 и подхода, основанного на кодах.
Я не могу сохранить объект в базе данных, так как получаю исключение, с внутренним исключением
"Переполнение произошло при преобразовании в дату и время"
при попытке сохранить тип Котировка:
public class Quotation
{
public int ID { get; set; }
public string Name { get; set; }
public DateTime DateCreated { get; set; }
public ContactPerson ContactPersonAssigned { get; set; }
public string OurReference { get; set; }
public string QuotationDataString { get; set; }
}
Я читал, что эта ошибка может быть вызвана несоответствием между настройками моего приложения и настройками базы данных sql compact относительно преобразования даты.
Я не уверен в этом, так как у моего файла базы данных sdf есть поле, которое правильно названо "DateCreated", not-nullable и типа "datetime".
Я новичок в SQL compact. Не могли бы вы помочь мне отладить эту проблему?
Ответы
Ответ 1
Если ваша модель имеет свойство non-nullable типа DateTime, когда вы отправляете форму с пустым значением для этого свойства, она автоматически устанавливается в DateTime.MinValue, которая находится в .net 01/01/0001 (DateTime.MinValue в MSDN)
(В качестве побочного примечания вы можете изменить это поведение, выполнив свой собственный IModelBinder
для DateTime, который может, например, выбросить исключение проверки, если попытка имеет значение null/empty и свойство не равно NULL).
Если вы попытаетесь сохранить это значение (DateTime.MinValue
) в базе данных, вы получите ошибку преобразования, если поле базы данных имеет тип datetime типа sql, поскольку .net DateTime.MinValue меньше минимального значения datetime SQL (01/01/1753 ) и поэтому не может быть преобразован в значение sql. (Минимальное значение SQL datetime для MSDN)
Эта ошибка не будет возникать в более поздних версиях MS SQL Server, которые имеют тип данных datetime2, который позволяет значения с 01/01/0001 по 31/12/9999 (SQL datetime2 в MSDN) (если datetime2 используется для этого поля, конечно).
Ответ 2
Это старый вопрос... но, возможно, кто-то может найти это полезным:
Я решил проблему (MVC4, EF5, SqlServerCE 4.0), используя следующее определение:
public DateTime? DateFrom { get; set; }
public DateTime? DateTo { get; set; }
Удачи!
Ответ 3
У меня была одна и та же проблема: при создании элемента базы данных даты базы данных dateTime исходное значение было нулевым.
Убедитесь, что фактическое дата-время было назначено перед сохранением объекта в локальной базе данных CE.