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

У меня есть примерная book classов:

 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 привело к значению вне диапазона. Заявление было прекращено.


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

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

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

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

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

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

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

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

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

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

Просто используйте DateTime? , Магии нет необходимости.

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

 public class Book { [Column(TypeName = "datetime2")] public DateTime DateAdded { get; set; } } 

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

 public override void Up() { CreateTable( "dbo.MyTable", c => new { Date = c.DateTime(false, 7, storeType: "datetime2"), }); } 
  • Entity Framework Code Только ошибка: модель, поддерживающая контекст, изменилась с момента создания базы данных
  • Сравнение с регистром LINQ to Entities
  • Результат запроса нельзя перечислить более одного раза
  • Как сделать Entity Framework Data Context Readonly
  • Чтение метаданных внешнего ключа программным путем с помощью Entity Framework 4
  • EF 4.3 Автоматическая миграция с несколькими DbContexts в одной базе данных
  • Является ли DbContext таким же, как DataContext?
  • Что такое независимые ассоциации и ассоциации с иностранными ключами?
  • Entity Framework 4 выборочно ленивые свойства загрузки
  • Уже есть открытый DataReader, связанный с этой Командой, который должен быть закрыт первым
  • Entity Framework Code First Fluent Api: добавление индексов в столбцы
  • Давайте будем гением компьютера.