Wygląda na to, że Twoja baza danych używa SmallDateTime jako typu daty. Jego minimalna wartość to 1900-styczeń-01. Zakładając, że Twoja jednostka jest podobna do poniższej
public class Game
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid GameId { get; set; }
[Required]
public DateTime GameTime { get; set; }
}
Twoja wartość GameTime nie dopuszcza wartości null, więc jeśli nie ustawisz dla niej żadnej wartości, zawsze będzie to DateTime.Min, która wynosi 0000-Jan-01. To jest poza zakresem SmallDateTime, ale znajduje się w zakresie DateTime2. Dlatego EF spróbuje przekazać typ SQL DateTime2 do serwera SQL. Ponieważ Twoja baza danych używa SmallDateTime, pojawi się błąd pokazany w Twoim pytaniu.
Aby rozwiązać ten problem, mam do wyboru następujące opcje:
-
uczynić pole nullalbe. (musisz zawsze sprawdzać, czy daty wprowadzenia mieszczą się w zakresie SmallDateTime.)
-
lub zmień typ daty na DateTime2 w serwerze SQL
-
lub zmusić EF do używania typu danych DateTime2 podczas tworzenia bazy danych. Kod będzie podobny do poniższego. (Ta metoda powinna znajdować się w twojej klasie kontekstu.)
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Property(t => t.GameTime )
.HasColumnType("datetime2");
}
-
Napisz pomocnik konwertera, aby ustawić minimalną wartość właściwości DateTime tak, aby odpowiadała smalldatetime w Twojej aplikacji.
-
Napisz wyzwalacz w bazie danych, aby przekonwertować DateTime2 (z końca aplikacji, ale datetime2 z końca bazy danych) na smalldatetime.
Mam nadzieję, że dobrze zrozumiałem Twoje pytanie, a moja odpowiedź jest pomocna.