2013-03-06 10 views
18

Czy możliwe jest globalne ustawienie Entity Framework DbContext w celu użycia datetime2 dla wszystkich właściwości, które są System.DateTime podczas korzystania z modelu Code-First?Siła Entity Framework 5 do korzystania z typu danych datetime2

Mogę to zrobić dla każdej kolumny przy użyciu metody HasColumnType(), ale dla istniejącej bazy kodów chciałbym rozwiązanie globalne.

+0

Ciekawe, dlaczego chcesz to zrobić. Powodem, dla którego pytam jest to, że jest to bardzo powszechny błąd podczas próby przypisania encji, która ma wartość domyślną dla nie-zerowalnej kolumny DateTime (DateTime.MinVal). Wyjątek wskazuje, że powinieneś użyć kolumny DateTime2, ale jest to w większości mylące, chyba że potrzebujesz dodatkowej precyzji. Poprawka polega na przypisaniu wartości innej niż domyślna dla pola DateTime lub zdefiniowaniu go jako zerowalnego. Mam nadzieję że to pomoże. –

+0

@ w.brian 1) Mamy tabele, w których przechowywane są dzieła sztuki i autorzy, w których oba mogą być tworzone/urodzone przed 1753 r. ... 2) Jeśli byłoby to możliwe, byłaby to alternatywa dla walidacji dat min. Dla każdego innego pole. 3) ciekawość techniczna ... –

+0

Gotcha. Chciałem tylko upewnić się, że nie robiłeś zepsutego drzewa, tak jak początkowo, gdy wpadłem na wyjątek, który zauważyłem powyżej. –

Odpowiedz

25

Od czasu EF6 już od jakiegoś czasu, a to pytanie wciąż pojawia się w wyszukiwaniach, tutaj jest sposób użycia niestandardowych konwencji, aby ustawić typ SQL. W ramach metody OnModelCreating w klasie DbContext:

modelBuilder.Properties<DateTime>() 
    .Configure(c => c.HasColumnType("datetime2")); 
+0

Czy jest to tylko nowy modal? ponieważ dostałem ten komunikat o błędzie w bazie danych aktualizacji: ALTER TABLE ALTER COLUMN Data nie powiodła się, ponieważ jeden lub więcej obiektów uzyskuje dostęp do tej kolumny. – Jacob

+1

@Jacob Czy masz na myśli, czy to zadziała, jeśli już utworzyłeś bazę danych dla modelu? Tak, ale musisz pamiętać o utworzeniu migracji po dodaniu konwencji do OnModelCreating. Tak to zrobiłem, więc wiem, że działa poprawnie, jeśli to zrobię :) –

+1

Miałem błąd w wyniku ograniczeń tabel. Rozwiązałem go, usuwając je ręcznie zgodnie z tą odpowiedzią: https://stackoverflow.com/a/19461205/665783 Jednak Twoja odpowiedź bardzo nam pomogła. Przefiltrowaliśmy całą bazę danych według opublikowanego przez Ciebie kodu. Dziękuję Ci! – Jacob

7

Nie w EF5, ale EF6 (obecnie w wersji alfa) zezwalaj na to z custom conventions. W przypadku EF5 potrzebowałbyś jakiegoś niestandardowego, opartego na konwencji systemu opartego na refleksji, który dodałby wywołania HasColumnType do konstruktora modelu poprzez odbicie - sprawdź na przykład EF Code First Extras (twierdzi, że obsługuje konwencje wtykowe).

Powiązane problemy