Cómo realizar un mapeo estricto en Dapper

.net c# dapper

Pregunta

Estoy usando dapper para asignar el conjunto de resultados SQL directamente a mi objeto C #, todo funciona bien.

Estoy usando declaraciones como esta para hacer el mapeo

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

pero esta afirmación no parece imponer el mapeo exacto entre los campos de clase y las columnas devueltas desde la base de datos. Es decir, no fallará cuando el campo en el POCO no exista en el conjunto de resultados.

Disfruto el hecho de que la implementación es flexible y no impone ningún derecho de restricción del murciélago, pero ¿hay alguna característica de Dapper que me permita exigir ciertos campos del conjunto de resultados antes de considerar el mapeo exitoso?

Respuesta aceptada

También puedes probar Dapper-Extensions

Aquí hay un ejemplo:

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

La prueba fallará debido a una columna Dirección faltante en la tabla Persona.

También puede ignorar columnas con Mapas personalizados :

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

Respuesta popular

No hay forma de que apliques esto "automágicamente" con un atributo o una bandera. Puedes seguir este tema abierto de Github para obtener más información.

Esto podría lograrse manualmente al mapear cada propiedad usted mismo en una cláusula de selección, aunque en ese punto ha perdido mucha potencia y facilidad de uso de Dapper.

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué