2012-06-27 12 views
14

Bardzo proste, konwertuję nasz istniejący system z EF na Dapper. Z różnych powodów korporacyjnych tak naprawdę nie możemy zmienić bazy danych, niektóre tabele mają kolumny typu DateTime2. Dapper konwertuje dowolny .net DateTime na DbType.DateTime.Jak mogę zmusić Dapper do mapowania datetime .net na datetime2?

Ktoś musiał wpadł na to wcześniej i znalazł proste rozwiązanie?

Odpowiedz

12

Dapper jest zaśmiecanie single file, który można dołączyć do bazy kodu. Wystarczy edytować plik:

wymiany (wokół linii 300):

 typeMap[typeof(Guid)] = DbType.Guid; 
     typeMap[typeof(DateTime)] = DbType.DateTime; 
     typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset; 
     typeMap[typeof(byte[])] = DbType.Binary; 

Z:

 typeMap[typeof(Guid)] = DbType.Guid; 
     typeMap[typeof(DateTime)] = DbType.DateTime2; 
     typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset; 
     typeMap[typeof(byte[])] = DbType.Binary; 

Edit:
Jest też pustych DateTime dalej tego bloku przekształceń, około linii 319:

 typeMap[typeof(DateTime?)] = DbType.DateTime; 
     typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset; 

Do:

 typeMap[typeof(DateTime?)] = DbType.DateTime2; 
     typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset; 
+0

Co zrobić, jeśli niektóre z nich są DateTime, a inne DateTime2? –

+0

@MetroSmurf Właściwie, trzymanie się DateTime2 jest najlepszym wyborem. DATETIME2 ma niejawną konwersję na DATETIME i odwrotnie w SQL Server. Jedynym problemem będzie utrata dokładności na sygnaturze czasowej, ponieważ .Net DateTime jest dokładniejsza niż SQL Server DATETIME. Jest to znany problem od lat, dlatego zaleca się stosowanie DATETIME2 w pierwszej kolejności. – Randolpho

+1

Próbowałem tego. Jednak nie można wstawić DateTime2 do DateTime w SQL. Otrzymujesz błąd. Lub, aby być dokładniejszym, domyślam się, że jeśli zadeklarujesz parametr polecenia jako DateTime2, SQL nie pozwoli ci wstawić go do DateTime (nie jestem pewien czy blokuje go SQLClient lub sam SQL). – Dirk

27

Jest to znacznie łatwiejsze rozwiązanie teraz w similar question:

SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTime2); 

ta musi być stosowana przedINSERT wieku. Dzięki, @Igand.

+1

Uwaga dla przyszłych pokoleń: Jeśli ta linia nie wydaje się pomagać, upewnij się, że mapowanie zostało zastosowane _przed rozpoczęciem wprowadzania danych i nadal trwa, zanim spróbujesz je wybrać. To oczywiste, ale zajęło mi ponad godzinę, aby dowiedzieć się, dlaczego test ciągle się nie udaje :) – Igand

+0

Dzięki, @Igand Właśnie dodałem to w odpowiedzi, więc nikt nie tęskni. =) –

Powiązane problemy