Как обойти EF 4.1, CodeFirst C # DateTime datetime2 против несовместимости datetime - PullRequest
4 голосов
/ 10 февраля 2012

Мой код Первые модели имеют System.DateTime свойства.Когда вызывается код заполнения базы данных, он выдает следующее исключение:

SqlException (0x80131904): преобразование типа данных datetime2 в тип данных datetime привело к значению вне диапазона.

Я создаю новый DateTime объект с помощью конструктора.Code First создает схему базы данных.Как мне преодолеть эту явную ошибку в Code First?Я не особо разбираюсь в своем типе данных.Мне просто нужно сохранить дату и, необязательно, время суток, но не решающее значение.

Я искал и прочитал много сообщений, но ни один с этой ошибкой не указал, что они получены из схемы данных, сгенерированных CodeFirst.Самый близкий ответ, который я нашел, заключался в внесении изменений в ProviderManifestToken в файле edmx, но в моем проекте нет файла edmx.Я не использовал конструктор, я использую Code First.

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

EF сопоставляет DateTime в .NET с datetime в SQL Server. Типы имеют различный диапазон: datetime может хранить только даты позже, чем около 1750 года. Если вы попытаетесь сохранить DateTime в вашей сущности с более ранней датой или в единичном DateTime (который имеет год 1), вы получить исключение, потому что SQL Server не может сохранить это.

Решение:

  • Либо убедитесь, что даты, которые вы хотите сохранить, позже, чем 1750
  • Или сопоставьте свои свойства DateTime явно с datetime2 в SQL Server, который имеет более широкий диапазон. Пример того, как определить это отображение с помощью Fluent API: https://stackoverflow.com/a/8044310/270591

На самом деле я также ожидал сопоставление по умолчанию с datetime2, потому что оно лучше подходит для DateTime в .NET. Но по какой-то причине они решили использовать datetime по умолчанию.

0 голосов
/ 11 февраля 2012

Извините, после более тщательной отладки я обнаружил, что ошибка возникла из-за инициализации объекта данных, когда я не указывал никакого значения для DateTime.

Я думал, что это исходит из длинного оператора заполнения данных, который включает новый DateTime(2012, 2, 19, 19, 0, 0) или что-то подобное. Спасибо Слауме за его усилия - он был прав, что это было связано с унифицированными ценностями.

...