Использование свойств DateTime в Code-First Entity Framework и SQL Server

У меня есть пример класса book :

public class Book
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime DateAdded { get; set; }
}

Когда я пытаюсь добавить новую книгу в контекст BookDb ...

using (BookDb db = new BookDb())
{
    Book book = new Book {
        Name = "Some name",
        DateAdded = DateTime.Now
    };

    db.Books.Add(book);
    db.SaveChanges();
}

... возникает ошибка:

System.Data.SqlClient.SqlException : преобразование типа данных datetime2 в тип данных datetime привел к значению вне допустимого диапазона. Оператор был прекращен.


Я обнаружил, что причиной этого является несовместимость типов datetime между .NET и SQL Server. Есть способ указать EF использовать формат SQL Server в традиционной Entity Framework, но как мне это сделать в Code-First Entity Framework?

Я использую EF4 в .NET 4 (Веб-приложение MVC 3) и SQL Server 2008 Express.

27
задан Chad Levy 7 November 2011 в 22:52
поделиться

1 ответ

Вы можете указать тип в Fluent API:

modelBuilder.Entity<Book>()
    .Property(f => f.DateTimeAdded)
    .HasColumnType("datetime2");

Это создаст столбец datetime2(7) в базе данных. Если вы хотите точно настроить точность, вы можете использовать:

modelBuilder.Entity<Book>()
    .Property(f => f.DateTimeAdded)
    .HasColumnType("datetime2")
    .HasPrecision(0);

... для столбца datetime2(0) в БД.

Однако код, который вы показали в своем вопросе, работает, потому что тип datetime позволяет сохранять даты примерно до 1750 года. Исключение происходит только для более ранних дат. Распространенной причиной этого исключения является неинициализированное свойство DateTime, поскольку оно представляет год 0001, который нельзя сохранить в столбце datetime в SQL Server.

Нет соответствующего атрибута для определения этого с аннотациями данных. Это возможно только с Fluent API.

49
ответ дан 28 November 2019 в 04:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: