Dapper: referencia de objeto no establecida en una instancia de un objeto

asp.net-mvc-4 dapper sql

Pregunta

Recientemente he estado jugando con dapper, pero me he encontrado con un problema relacionado con la obtención de datos de otras tablas.

Mi base de datos tiene dos tablas, Usuarios y Publicación. Creé dos clases para estas tablas.

Mi clase de usuario

 public class User
 {
    public int UserId { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime JoinDate { get; set; }
 }  

Mi clase de publicaciones

  public class Post
 {
    public int PostId { get; set; }
    public string Title { get; set; }
    public DateTime PublishDate { get; set; }
    public int UserId { get; set; }
    public User User { get; set; }
 }

Esta es mi consulta para obtener todos los datos de la publicación de mi base de datos, y también obtener el nombre de usuario que creó la publicación.

    public IEnumerable<Post> GetPosts()
    {
        string myQuery = "SELECT p.Title, p.PublishDate, p.PostId, p.UserId, u.Username FROM Post p INNER JOIN Users u ON p.UserId = u.UserId";

        sqlConnection.Open();
        var posts = sqlConnection.Query<Post>(myQuery);

        return posts;
    }

Aquí está mi código de vista donde quiero mostrar la información:

@model IEnumerable<MvcDapperIntro.Models.Post>

@{
    ViewBag.Title = "Posts";
}

@foreach (var post in Model)
{
    <h3>@post.Title</h3>
    <p>@post.PublishDate.ToString("dd/MM/yyyy")</p>
    <p>@post.User.Username</p>
}

Sin embargo, cuando ejecuto mi código, obtengo el error 'Referencia de objeto no configurado a una instancia de un objeto'. Esto es porque no debería estar usando:

public User User { get; set; }

para acceder a la propiedad username, o debería crear una nueva clase con un campo de nombre de usuario. Cualquier entrada sería apreciada.

Respuesta aceptada

I get the 'Object reference not set to an instance of an object' error

Apuesto a que el problema está en esta línea: <p>@post.User.Username</p> y eso se debe a que no <p>@post.User.Username</p> el objeto User. Debes cambiar este código:

var posts = sqlConnection.Query<Post>(myQuery);

a esto:

var posts = sqlConnection.Query<Post, User, Post>(
                myQuery,
                (p, u) => { p.User = u; return p; }
                );


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é