Dapper - Il riferimento all'oggetto non è impostato su un'istanza di un oggetto

asp.net-mvc-4 dapper sql

Domanda

Recentemente ho giocato con Dapper, ma ho avuto un po 'di problemi con il recupero dei dati da altri tavoli.

Il mio database ha due tabelle, utenti e posta. Ho creato due classi per queste tabelle.

La mia classe utente

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

La mia lezione

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

Questa è la mia query per recuperare tutti i dati del post dal mio database, e anche ottenere il nome utente che ha creato il post.

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

Ecco il mio codice di vista in cui voglio visualizzare le informazioni:

@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>
}

Tuttavia, quando eseguo il mio codice, ottengo l'errore "Riferimento oggetto non impostato su un'istanza di un oggetto". È perché non dovrei usare:

public User User { get; set; }

per accedere alla proprietà username o dovrei creare una nuova classe con un campo username. Qualsiasi input sarebbe apprezzato.

Risposta accettata

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

Scommetto che il problema è su questa riga: <p>@post.User.Username</p> e questo perché non hai <p>@post.User.Username</p> l'oggetto User. Dovresti cambiare questo codice:

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

a questa:

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché