2016-08-25 3 views
0

Ich verwende Dapper Erweiterungen und habe eine Frage über die class mapper. Leider typischerweise die meisten meiner Tabellen müssen einige Mapping ihnen angetan wie verschiedene Schemata usw.Hinzufügen mehrerer Karten bei Verwendung von Dapper Erweiterungen

Also ich finde ich bin die DefaultMapper nach unten eine Menge Auslagern tun:

public Hierarchies HierarchyGetByName(string aName) 
{ 
    Hierarchies result; 

    using (SqlConnection cn = GetSqlConnection()) 
    { 
     cn.Open(); 

     Type currModelMapper = DapperExtensions.DapperExtensions.DefaultMapper; 
     try 
     { 
      DapperExtensions.DapperExtensions.DefaultMapper = typeof(HierarchiesMapper); 
      IFieldPredicate predicate = Predicates.Field<Hierarchies>(f => f.Name, Operator.Eq, aName); 
      result = cn.GetList<Hierarchies>(predicate).FirstOrDefault(); 
     } 
     finally 
     { 
      DapperExtensions.DapperExtensions.DefaultMapper = currModelMapper; 
     } 


     cn.Close(); 
    } 

    return result; 
} 

Wenn ich 2 zugreifen Tabellen dann muss ich das zum Beispiel zweimal machen.

Gibt es eine Möglichkeit, alle Mapper-Klassen gleichzeitig hinzuzufügen, um eine Sammlung zu sagen, und je nachdem, auf welche Tabelle zugegriffen wird, wird die richtige ausgewählt?

Antwort

0

Sie können in Ihrer App eine Reihe von Klassen hinzufügen, die eine benutzerdefinierte Neuzuordnung auf Ihre Entitäten anwenden. Diese drei leeren Klassen wenden beispielsweise den PrefixDapperTableMapper auf die Klassen Profile und FileNotificationAdhocRecipient an, während AnotherDifferentTypeOfDapperClassMapper auf NotificationProfile angewendet wird.

public class ProfileMapper : PrefixDapperTableMapper<Domain.Entities.Profile> 
{ 
} 

public class FileNotificationAdhocRecipientMapper : PrefixDapperTableMapper<Domain.Entities.FileNotificationAdhocRecipient> 
{ 
} 

public class NotificationProfileMapper : AnotherDifferentTypeOfDapperClassMapper<Domain.Entities.NotificationProfile> 
{ 
} 

und Ihre eigentlichen Code-Mapping existiert in separaten Mapper (ich habe nicht AnotherDifferentTypeOfDapperClassMapper gezeigt, aber das würde auf unter ähnlich sein)

public class PrefixDapperTableMapper<T> : ClassMapper<T> where T : class 
{ 
    public PrefixDapperTableMapper() 
    { 
     AutoMap(); 
    } 

    //name or schema manipulations in some overrides here. 
} 

Solange sie in der gleichen Baugruppe sind, DapperExtensions finden und sie verwenden, oder Sie können die Abbildungsanordnung mit Code ähnlich eingestellt:

DapperExtensions.DapperExtensions.SetMappingAssemblies({ typeof(ProfileMapper).Assembly }) 
+0

so sind alle meine AutoClassMapper Klassen gefunden werden, solange sie sind alle d in der gleichen Versammlung elcared? Die gleiche Baugruppe wie was? – TheEdge

+0

Dieselbe Assembly, in der Sie Ihre cn.GetList-Methoden aufrufen. Wenn Sie nur ein Projekt/eine Baugruppe haben, ist das kein Problem. Ich habe es erwähnt, falls Sie mehrere Projekte in Ihrer Lösung haben. –

+1

Sie müssen Ihre Karten nicht in der aufrufenden Assembly haben. Sie können verwenden: DapperExtensions.SetMappingAssemblies (new [] {typeof (MyCustomClassMapper) .Assembly}); –

Verwandte Themen