2012-08-29 12 views
19

C'è un modo con dapper-dot-net per usare un attributo per specificare i nomi di colonna che dovrebbero essere usati e non il nome della proprietà?Posso specificare i nomi delle colonne DB per i mapping dapper-dot-net?

public class Code 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    // This is called code in the table. 
    public string Value { get; set; } 
    public string Description { get; set; } 
} 

Mi piacerebbe essere in grado di denominare le mie proprietà qualunque cosa scelgo. Il nostro database non ha una convenzione di denominazione coerente.

Se non con dapper, ci sono altre opzioni simili?

+6

'Il nostro database non ha una convenzione di denominazione coerente.'questa è una buona ricetta per un disastro! :) Prima o poi ... – walther

risposta

25

È anche possibile controllare Dapper-Extensions.

Dapper estensioni è una piccola biblioteca che integra Dapper con l'aggiunta di operazioni CRUD di base (GET, Insert, Update, Delete) per i vostri Pocos.

Ha un auto class mapper, in cui è possibile specificare i mapping dei campi personalizzati. Per esempio:

public class CodeCustomMapper : ClassMapper<Code> 
{ 
    public CodeCustomMapper() 
    { 
     base.Table("Codes"); 
     Map(f => f.Id).Key(KeyType.Identity); 
     Map(f => f.Type).Column("Type"); 
     Map(f => f.Value).Column("Code"); 
     Map(f => f.Description).Column("Foo"); 
    } 
} 

Poi basta fare:

using (SqlConnection cn = new SqlConnection(_connectionString)) 
{ 
    cn.Open(); 
    var code= new Code{ Type = "Foo", Value = "Bar" }; 
    int id = cn.Insert(code); 
    cn.Close(); 
} 

Tenete a mente che è necessario tenere le mappe personalizzate nello stesso assembly come le vostre classi POCO. La libreria utilizza la reflection per trovare mappe personalizzate e scansiona solo un assembly.

Aggiornamento:

È ora possibile utilizzare SetMappingAssemblies per registrare un elenco di gruppi per la scansione:

DapperExtensions.SetMappingAssemblies(new[] { typeof(MyCustomClassMapper).Assembly }); 
+0

A che punto viene applicato questo Mapper? –

+0

Stavo per chiedere la stessa cosa. Ho creato ClassMapper, ma come si "registra" con il sistema da utilizzare? Non si registra automaticamente perché il mio costruttore non viene mai chiamato. – MarqueIV

+0

Ho aggiornato la risposta. –

18

Se si utilizza un'istruzione select direttamente o in una procedura, è possibile semplicemente creare un alias delle colonne.

SELECT code as Value FROM yourTable 
2

Per seleziona, è possibile aggiungere i costruttori alle classi per eseguire la mappatura. I nomi dei parametri del costruttore devono corrispondere alle colonne della tabella.

Di seguito è riportato un esempio dalla fonte. La tabella verrà mappata correttamente alla classe.

Tabella:

CREATE TABLE #Users (Id int, Name varchar(20)) 

Classe:

class UserWithConstructor 
    { 
     public UserWithConstructor(int id, string name) 
     { 
      Ident = id; 
      FullName = name; 
     } 
     public int Ident { get; set; } 
     public string FullName { get; set; } 
    } 
+0

Davvero, Dapper genera un errore lamentandosi dell'assenza di un costruttore predefinito necessario per materializzare i valori? – Oliver

3

Un altro approccio è quello di mappare solo manualmente con il risultato dinamico.

var codes = conn.Query<dynamic>(...sql and params here...) 
       .Select<dynamic,Code>(s=>new Code{Id = s.Id, Type = s.Type, Value = s.code, Description = s.Description}); 

Chiaramente questo introduce gli scenari di sicurezza del tipo perché si sta eseguendo una query su dinamico. Inoltre, devi mappare manualmente le colonne che è un peccato.

Tuttavia, tendo ad apprezzare questo approccio perché è così trasparente. Puoi lanciare se necessario (come nel caso di Enums), e in pratica fai semplicemente tutto ciò che devi fare per andare dal recordset db alle tue proprietà.

+0

Perché il downvote? – BlackjacketMack

Problemi correlati