EF Update Exception: преобразование типа данных datetim2 в datetime - PullRequest
0 голосов
/ 22 февраля 2012

Я анализирую несколько небольших файлов XML в объектах EF, а затем загружаю их в базу данных SQL Server 2008.

Определение таблицы:

CREATE TABLE [dbo].[Events](
    [ID] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL,
    [EventDate] datetime NULL
)

XML:

<root>
    <event date="2012-02-16T13:14:53" />
    <event date="2012-02-16T13:14:53" />
    <event date="2012-02-15T18:48:32" />
<root>

Разбор XML:

var events = XDocument.Load(xmlStream)
    .Descendants("event")
    .Select(x => new Event
    {
        EventDate = (DateTime?)x.Attribute("date")
    });

Отправка в БД:

foreach(var event in events)
{
    dbContext.Events.Add(event);
}
dbContext.SaveChanges();

И я получаю следующую ошибку:

System.Data.SqlClient.SqlException: The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.

Я искал и пробовал все следующее безрезультатно:

  • Изменение EDMX 'ProviderManifestToken' с "2008" на "2005"
  • Изменение «StoreGeneratedPattern» на «Computed»
  • Изменение выражения Linq to XML

Кажется, ничего не работает ... здесь кончаются идеи ...

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Решение не имело ничего общего с разбором этого конкретного DateTime.Я забыл, что в базе данных есть столбец datetime, в котором используется ограничение DEFAULT.Как только я позаботился об этом, все работало нормально.

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

Как уже упоминалось, попробуйте разобрать дату напрямую.

EventDate = DateTime.ParseExact(x.Attribute("date"), "yyyy-MM-ddTHH:mm:ss", Culture.InvariantCulture)

Этот тип ошибок обычно появляется при попытке вставить DateTime.MinValue или DateTime.MaxValue в sql. Что не очень хорошая идея. Вы можете распечатать события?

events.ForEach( x => Console.WriteLine(x.EventDate) )
0 голосов
/ 22 февраля 2012

Если бы я разбирал DateTime из строки XML, я бы попытался использовать DateTime.Parse

Похоже, что ваша дата и время могут быть сделаны с помощью простого String.replace.

Я думал, что есть функция разбора, в которую можно передать строку форматирования (например, "yyyy-MM-ddThh:mm:ss"), но я не могу сейчас найти документацию.

...