¿Existe un equivalente a "NotMapped" para Dapper.Net y las extensiones de Dapper.Net?

dapper micro-orm

Pregunta

Empecé a jugar con Dapper.Net y hasta ahora me encanta, sin embargo, me he encontrado con un problema.

Digamos que tengo una clase de POCO como:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get { return FirstName + " " + LastName; } }
}

Ahora, usando las extensiones Dapper.Net y Dapper.Net, quiero simplemente cargar todas las instancias de ese tipo de datos del DB haciendo esto:

string connectionString = CloudConfigurationManager.GetSetting("DBConnection");
using (SqlConnection cn = new SqlConnection(connectionString))
{
    cn.Open();

    IEnumerable<Types.Person> entities = cn.GetList<Types.Person>();
    var forceMe = entities.ToList();
}

Esto funciona bien en la configuración de Linq, pero cuando alcanza la línea con .ToList (), lo que obliga a la evaluación, explota con "nombres de columna no válidos" en FullName. Pensando que podría respetar el material de Entity Framework DataAnnotations para NotMapped, traté de agregar un atributo NotMapped (después de agregar EF 5 al proyecto). Esto no funcionó.

Entonces, la pregunta es, ¿cómo le digo a Dapper.Net que no se espera una columna del DB? ¿Es esto un problema con las extensiones, tratando de mapear una columna de DB para todo lo que ve en el modelo POCO? ¿Debo volver a escribir SQL y preguntar explícitamente por las columnas que solo deseo, o hay una forma de obtener un equivalente a NotMapped en la columna?

Gracias por adelantado.

-Adán

Respuesta aceptada

Creo que la única forma de ignorar el mapeo de ciertas propiedades es implementar un mapeador de clase automático , donde puede especificar las asignaciones de campo personalizadas. Por ejemplo:

public class CustomMapper : ClassMapper<Foo>
{
    public CustomMapper()
    {
        Table("FooTable");
        Map(f => f.Id).Column("FooId").Key(KeyType.Identity);
        Map(f => f.DateOfBirth).Column("BirthDate");
        Map(f => f.FirstName).Column("First");
        Map(f => f.LastName).Column("Last");
        Map(f => f.FullName).Ignore();
        Map(f => f.Calculated).ReadOnly();
    }
}

public class Foo
{
    public int Id { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName
    {
        get { return string.Format("{0} {1}", FirstName, LastName); }
    }
}

En el ejemplo anterior, se ignora FullName.

El auto mapeador también le permite ajustar los nombres de las tablas, en caso de que los nombres de las clases POCO no coincidan con los nombres de las tablas.

Además, tenga en cuenta que debe mantener sus mapas personalizados en el mismo conjunto que sus clases POCO. La biblioteca usa la reflexión para encontrar mapas personalizados y solo escanea un ensamblaje.

Espero que esto ayude, buena suerte



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é