Использование свойств DateTime в Code-First Entity Framework и SQL Server - PullRequest
26 голосов
/ 08 ноября 2011

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

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

Когда я пытаюсь добавить новый book в контекст 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 между .NET и SQL Server. Есть способ заставить EF использовать формат SQL Server в традиционной Entity Framework, но как мне это сделать в Code-First Entity Framework?

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

Ответы [ 4 ]

47 голосов
/ 08 ноября 2011

Вы можете указать тип в 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.

30 голосов
/ 26 февраля 2012

При сохранении даты необходимо указать значение.Вот почему вы получаете эту ошибку.

Просто используйте DateTime?.Нет необходимости в магии выше.

23 голосов
/ 18 марта 2015

Вы можете аннотировать атрибут вашего класса с типом datetime2.

public class Book
{
    [Column(TypeName = "datetime2")]
    public DateTime DateAdded { get; set; }
}
2 голосов
/ 09 февраля 2016

Если миграция включена, вы также можете отрегулировать вещи прямо здесь

...