Dapper Extension: clase con campos compuestos, asignados a una tabla individual

.net c# dapper dapper-extensions

Pregunta

Tengo las siguientes clases:

public class Publication
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Headline { get; set; }
    public DateTime Published { get; set; }
    public ProductContact Contact { get; set; }
}

public class ProductContact
{
    public string FullName { get; set; }
    public string JobTitle { get; set; }
    public string Email { get; set; }
}

Y la tabla asociada a esta estructura, "Publicaciones", tiene todos estos campos (incluidas las propiedades de ProductContact).

Si trato de insertar una fila de publicación (con la información de ProductContact incluida), el programa arroja una excepción:

System.NotSupportedException: The member Contact of type ProductContact cannot be used as a parameter value

Entonces, agregué un mapeador para mapear las propiedades de ProductContact a los campos en la tabla de Propiedades:

  public PublicationMapper ()
    {
        TableName = "Publications";

        Map(x => x.Contact.FullName).Column("ContactFullName");
        Map(x => x.Contact.JobTitle).Column("ContactJobTitle");
        Map(x => x.Contact.Email).Column("ContactEmail");

        AutoMap();
    }

Con este mapeador consigo la misma excepción.

Luego, agregué la declaración de ignorar para el campo de Contacto, para decirle a Dapper que no incluya este elemento en la declaración de inserción

            Map(x => x.Contact).Ignore();

En este caso, recibo otra excepción:

System.Data.SqlClient.SqlException (0x80131904): Must declare the scalar variable "@FullName".

Indica que Dapper está ignorando completamente esta propiedad y que la asignación agregada en el paso anterior no tiene efecto.

¿Hay alguna manera de mapear las propiedades ProductContact a los campos de la tabla?

Gracias.

Respuesta aceptada

No creo que esto sea posible con DapperExtensions.

En uno de sus problemas , dicen

Actualmente, no estamos planeando admitir objetos anidados. Sin embargo, puedes crear tu propio Mapper que te permita omitir el objeto anidado

He intentado una variedad de enfoques y diferentes clases de mapeo y no puedo llegar a ninguna parte. No creo que admitan ninguna forma de mapear valores de propiedades anidadas e ignorar la propiedad en sí misma (que, si no se hace, dará como resultado " no se puede usar como un valor de parámetro "error".

Un enfoque sería aplanar manualmente su objeto en una clase anónima (como lo sugiere @juharr en un comentario sobre su pregunta), otro enfoque sería usar algo como AutoMapper para aplanar su objeto complejo en un modelo de inserción aplanada.



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é