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