Từ giao diện của lỗi, cơ sở dữ liệu của bạn đang sử dụng SmallDateTime làm loại ngày. Giá trị tối thiểu của nó là 1900-Jan-01. Giả sử thực thể của bạn giống như bên dưới
public class Game
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid GameId { get; set; }
[Required]
public DateTime GameTime { get; set; }
}
Giá trị GameTime của bạn không thể nullable, vì vậy khi bạn không đặt bất kỳ giá trị nào cho nó, nó sẽ luôn là DateTime.Min là 0000-Jan-01. Điều này nằm ngoài phạm vi của SmallDateTime, nhưng nó nằm trong phạm vi của DateTime2. Vì vậy, EF sẽ cố gắng chuyển một kiểu SQL DateTime2 đến máy chủ SQL. Vì cơ sở dữ liệu của bạn đang sử dụng SmallDateTime, bạn sẽ gặp lỗi được hiển thị trong câu hỏi của mình.
Để giải quyết vấn đề, bạn có các tùy chọn sau mà tôi có thể nghĩ đến:
-
làm cho trường không có giá trị. (bạn phải luôn kiểm tra xem ngày nhập của mình có nằm trong phạm vi SmallDateTime hay không.)
-
hoặc thay đổi loại ngày thành DateTime2 trong máy chủ SQL
-
hoặc buộc EF sử dụng kiểu dữ liệu DateTime2 khi tạo cơ sở dữ liệu. Mã sẽ giống như một cái gì đó bên dưới. (Phương thức này nên nằm trong lớp ngữ cảnh của bạn.)
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Property(t => t.GameTime )
.HasColumnType("datetime2");
}
-
Viết trình trợ giúp chuyển đổi để đặt giá trị tối thiểu của thuộc tính DateTime của bạn để khớp với smalldatetime trong ứng dụng của bạn.
-
Viết kích hoạt trong cơ sở dữ liệu để chuyển đổi DateTime2 (từ phần cuối ứng dụng, nhưng datetime2 ở phần cuối cơ sở dữ liệu) thành smalldatetime.
Hy vọng rằng tôi đã hiểu đúng câu hỏi của bạn và câu trả lời của tôi sẽ giúp ích cho bạn.