Dapper: ¿cómo cargar propiedades virtuales?

c# dapper sql

Pregunta

Quiero recuperar un Advert

public class Advert
{
    public int ID { get; set; }
    public DateTime DateCreation { get; set; }
    public String Title { get; set; }
    public String Description { get; set; }
    public virtual Member Creator { get; set; }
}

(con la propiedad Creator cargada)

public class Member
{
    public int ID { get; set; }
    public String Name { get; set; }
    public String Email { get; set; }
    public String Password { get; set; }
}

con la siguiente función:

public Advert GetById(int id)
{
    String sql = "select * from Advert inner join Member on Advert.Creator = Member.ID where Advert.ID = @aid";
    return unitOfWork.Connection.Query<Advert,Member,Advert>(sql, (advert, member) => { advert.Creator = member; return advert; } , new { aid=id}).Single();
}

Pero tengo el siguiente error:

InvalidCastException: no se puede convertir el objeto del tipo 'System.Int32' a 'Models.Member'.

¿Cuál podría ser la causa del error?

Respuesta aceptada

Según la consulta, parece que la columna Advert.Creator , que parece ser del tipo int , está en conflicto con la propiedad Member Creator del modelo.

Cambia el nombre de la propiedad a otra cosa para evitar el conflicto de nombre

public class Advert {
    public int ID { get; set; }
    public DateTime DateCreation { get; set; }
    public String Title { get; set; }
    public String Description { get; set; }
    public virtual Member Owner { get; set; }
}

Y actualice la consulta en consecuencia

public Advert GetById(int id) {
    var connection = unitOfWork.Connection;
    String sql = 
    @"select * from Advert AS A
    inner join Member AS M on A.Creator = M.ID 
    where A.ID = @aid";
    var data connection.Query<Advert, Member, Advert>(
        sql, 
        (advert, member) => { advert.Owner = member; return advert; }, 
        new { aid = id }
    );
    return data.Single();
}

Idealmente, la columna Advert.Creator en la tabla debería tener el nombre CreatorId . Esto habría permitido que el código original funcione como se desee.



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é