AnsiStrings può essere usato di default con Dapper?

c# dapper

Domanda

Sto usando Dapper contro un database in cui le stringhe sono memorizzate principalmente nelle colonne VarChar . Per impostazione predefinita, Dapper utilizza i parametri NVarChar durante la generazione di query e, mentre riesco a racchiudere tutti i parametri di stringa che uso con DbString , sarebbe fantastico utilizzare AnsiStrings per impostazione predefinita e utilizzare DbString per il caso NVarChar .

Ho provato a cambiare la mappa dei tipi nell'origine Dapper da DbType.String a DbType.AnsiString tuttavia ciò sembra causare un errore nella generazione di IL per i parametri delegati (lancia un InvalidProgramException ).

C'è un modo più semplice per farlo?

Aggiornare

Cambiare semplicemente typeMap non era sufficiente. Avevo bisogno di modificare alcuni if (dbType == DbType.String) anche. Ora funziona!

Risposta accettata

Puoi farlo senza modificare il codice sorgente.

Dapper.SqlMapper.AddTypeMap(typeof(string), System.Data.DbType.AnsiString);

Impostandolo una volta si regolano tutte le stringhe su varchar.


Risposta popolare

Per usare ansistrings di default dovevo (facendo riferimento a Dapper 1.3 source da NuGet):

  • Modificare la mappa dei tipi per utilizzare DbType.AnsiString su L164 anziché DbType.String
  • Nel metodo CreateParamInfoGenerator modificare i controlli su L960, L968, L973 per includere DbType.AnsiString e DbType.String .

Il problema con l'IL non valido sembrava essere che il ramo successivo del codice su L1000 verifica la presenza di typeof(string) mentre i rami precedenti utilizzano DbType .

Facendo tutto è di nuovo peachy - niente più scansioni indice!



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché