2012-08-29 8 views
19

Czy istnieje sposób, w jaki można zastosować atrybut dapper-dot-net, aby użyć atrybutu do określenia nazw kolumn, które powinny zostać użyte, a nie nazwy właściwości?Czy mogę podać nazwy kolumn DB dla odwzorowań sieci z efektem "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; } 
} 

Chciałbym móc wymienić moje właściwości, które wybiorę. Nasza baza danych nie ma spójnej konwencji nazewnictwa.

Jeśli nie z dapper, czy są jakieś dodatkowe podobne opcje?

+6

'Nasza baza danych nie ma spójnej konwencji nazewnictwa."to dobry przepis na katastrofę! :) Prędzej czy później ... – walther

Odpowiedz

25

Możesz również sprawdzić Dapper-Extensions.

Dapper Rozszerzenia to mała biblioteka, która uzupełnia Dapper dodając podstawowe operacje CRUD (GET, Insert, Update, Delete) dla Poços.

Ma on auto class mapper, gdzie można określić niestandardowe odwzorowania pól. Na przykład:

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"); 
    } 
} 

Wtedy po prostu zrobić:

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

Należy pamiętać, że trzeba zachować swoje własne mapy w tym samym zespole co klasach poco. Biblioteka używa odbicia, aby znaleźć niestandardowe mapy i skanuje tylko jeden zespół.

Aktualizacja:

Można teraz używać SetMappingAssemblies aby zarejestrować listę zespołów do skanowania:

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

W którym momencie ten Mapper zostaje zastosowany? –

+0

Już miałem zapytać o to samo. Stworzyłem ClassMapper, ale jak "zarejestrować" go w systemie, który ma być użyty? To nie jest automatyczna rejestracja, ponieważ mój konstruktor nie zostaje wywołany. – MarqueIV

+0

Zaktualizowałem odpowiedź. –

18

Jeśli używasz instrukcji select bezpośrednio lub w procedurze, możesz po prostu aliasować kolumny.

SELECT code as Value FROM yourTable 
2

Dla wybiera, można dodać konstruktorów do swoich klas, aby wykonać mapowanie. Nazwy parametrów konstruktora muszą być zgodne z kolumnami tabeli.

Poniżej znajduje się przykład ze źródła. Tabela zostanie poprawnie przyporządkowana do klasy.

Tabela:

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

Klasa:

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

Naprawdę, Dapper zgłasza błąd narzekający na brak konstruktora domyślnego, który jest potrzebny do zmaterializowania wartości? – Oliver

3

Innym sposobem jest po prostu ręcznie mapować z dynamicznym wyniku.

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}); 

Oczywiście wprowadza to scenariusze bezpieczeństwa, ponieważ zapytania są przeprowadzane dynamicznie. Ponadto musisz ręcznie mapować kolumny, co jest bummerem.

Jednak lubię to podejście, ponieważ jest tak cholernie przezroczysty. W razie potrzeby można rzutować (tak jak w przypadku Enums), i po prostu robić to, co trzeba, aby przejść z zestawu rekordów db do właściwości.

+0

Dlaczego spadamy? – BlackjacketMack

Powiązane problemy