2016-08-17 9 views
1

Ich verwende Dapper, um SQL-Ergebnismenge direkt zu meinem C# -Objekt zuzuordnen, alles funktioniert gut.So führen Sie strikte Mapping auf Dapper

Ich bin mit Aussagen wie diese das Mapping

var result = connection.Query < MyClass> zu tun ("sp_select");

Diese Anweisung scheint jedoch keine genaue Zuordnung zwischen den Klassenfeldern und den aus der Datenbank zurückgegebenen Spalten zu erzwingen. Das heißt, es wird nicht fehlschlagen, wenn das Feld auf dem POCO nicht in der Ergebnismenge existiert.

Ich genieße die Tatsache, dass die Implementierung lose ist und keine Einschränkung Recht der Fledermaus erzwingt, aber gibt es eine Funktion von Dapper, die es mir erlauben würde, bestimmte Felder aus der Ergebnismenge vor dem erfolgreichen Mapping zu verlangen ?

Antwort

1

Sie auch Dapper-Extensions

Hier ist ein Beispiel ausprobieren können:

public class Person 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
} 

[TestFixture] 
public class DapperExtensions 
{ 
    private SqlConnection _connection; 

    [SetUp] 
    public void Init() 
    { 
     _connection = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=mydb"); 
     _connection.Open(); 

     _connection.Execute("create table Person(Id int not null, FirstName varchar(100) not null, LastName varchar(100) not null)"); 
     _connection.Execute("insert into Person(Id, FirstName, LastName) values (1, 'Bill', 'Gates')"); 
    } 

    [TearDown] 
    public void Teardown() 
    { 
     _connection.Execute("drop table Person"); 
     _connection.Close(); 
    } 

    [Test] 
    public void Test() 
    { 
     var result = _connection.Get<Person>(1); 
    } 
} 

Der Test wird nicht mehr aufgrund einer fehlenden Adresse Spalte in der Tabelle Person.

Sie können auch Spalten mit Custom Maps ignorieren:

public class PersonMapper : ClassMapper<Person> 
{ 
    public PersonMapper() 
    { 
     Map(x => x.Address).Ignore(); 
     AutoMap(); 
    } 
} 
1

Es gibt keine Möglichkeit, dies "automatisch" mit einem Attribut oder einem Flag zu erzwingen. Sie können diese open Github issue für mehr Hintergrund folgen.

Dies könnte durch Sie manuell durch Abbilden jeder Eigenschaft, sich in einer select-Klausel erreicht werden, obwohl an diesem Punkt Sie viel von der Leistung und Benutzerfreundlichkeit von Dapper verloren haben.

var result = connection.Query<MyClass>("sp_select") 
         .Select(x => 
         { 
          // manually map each property and verify 
          // that the data is returned 
         }); 
+0

Dank für den Hinweis, die offene Frage auf Github, war ich sicher, dass jemand schon für diese Funktion irgendwann gefragt hatte ... Ich habe einfach nicht der richtige Wortlaut in meiner Suche. Und es macht einen Sinn, warum sie sich weigern, die Funktion zeitnah hinzuzufügen. –