2012-06-27 21 views
14

Bastante simple, estoy convirtiendo nuestro sistema existente de EF a Dapper. Por diversas razones corporativas, no podemos realmente cambiar la base de datos, algunas de las tablas tienen columnas que son del tipo DateTime2. Dapper convierte cualquier .Time DateTime a DbType.DateTime.¿Cómo puedo obtener que Dapper asigne .net datetime a datetime2?

Alguien debe haber chocado contra esto antes y ha encontrado una solución fácil?

Respuesta

12

Dapper es literalmente un single file que incluye en su código base. Basta con modificar el archivo:

Reemplazar (alrededor de la línea 300):

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

Con:

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

Editar:
También hay un DateTime anulable más abajo en ese bloque de asignaciones, alrededor de la línea 319:

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

:

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

¿Qué pasa si algunos son DateTime y otros son DateTime2? –

+0

@MetroSmurf En realidad, creo que seguir con DateTime2 es la mejor opción. DATETIME2 tiene una conversión implícita a DATETIME y viceversa en SQL Server. El único problema será la pérdida de precisión en la marca de tiempo porque .Net DateTime es más preciso que SQL Server DATETIME. Sin embargo, este ha sido un problema conocido durante años, por lo que se recomienda utilizar DATETIME2 en primer lugar. – Randolpho

+1

Lo intenté. Sin embargo, no puede insertar un DateTime2 en un DateTime en SQL. Obtienes un error. O para ser más precisos, supongo que si declara su parámetro de comando como DateTime2, SQL no le permitirá insertarlo en DateTime (no estoy seguro de si SQLClient lo está bloqueando o si se trata de SQL). – Dirk

27

Hay una solución mucho más fácil ahora en un similar question:

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

Esto se debe aplicar antes de INSERT 's. Gracias, @Igand.

+1

Nota para las generaciones futuras: si esta línea no parece ayudar, asegúrese de que se haya aplicado la asignación antes de INSERTAR los datos y aún se conserva antes de intentar SELECCIONARlos. Es obvio, pero me llevó más de una hora entenderlo, por qué la prueba sigue fallando :) – Igand

+0

Gracias, @Igand Acabo de agregarlo en la respuesta para que nadie lo pierda. =) –

Cuestiones relacionadas