Dapper - La référence d'objet n'est pas définie sur une instance d'objet

asp.net-mvc-4 dapper sql

Question

J'ai récemment joué avec dapper, mais j'ai eu un problème avec l'obtention de données provenant d'autres tables.

Ma base de données contient deux tables, Users et Post. J'ai créé deux classes pour ces tables.

Ma classe d'utilisateurs

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

Mon cours de poste

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

C'est ma requête pour récupérer toutes les données de publication de ma base de données, et également obtenir le nom d'utilisateur qui a créé la publication.

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

Voici mon code de vue où je veux afficher les informations:

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

Cependant, lorsque j'exécute mon code, j'obtiens l'erreur "Référence d'objet non définie à une instance d'objet". Est-ce parce que je ne devrais pas utiliser:

public User User { get; set; }

pour accéder à la propriété nom d'utilisateur, ou devrais-je créer une nouvelle classe avec un champ nom d'utilisateur. Toute contribution serait appréciée.

Réponse acceptée

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

Je parie que le problème est sur cette ligne: <p>@post.User.Username</p> et c'est parce que vous n'avez pas mappé l'objet User. Vous devriez changer ce code:

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

pour ça:

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi