Dapper - Objektverweis nicht auf eine Instanz eines Objekts gesetzt

asp.net-mvc-4 dapper sql

Frage

Ich habe vor kurzem mit Dapper experimentiert, aber ich habe ein kleines Problem in Bezug auf Daten von anderen Tabellen bekommen.

Meine Datenbank hat zwei Tabellen, Benutzer und Post. Ich habe zwei Klassen für diese Tabellen erstellt.

Meine Benutzerklasse

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

Meine Post-Klasse

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

Dies ist meine Abfrage, um alle Post-Daten aus meiner Datenbank abzurufen, und auch den Benutzernamen, der den Post erstellt hat.

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

Hier ist mein Ansichtscode, in dem ich die Informationen anzeigen möchte:

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

Wenn ich jedoch meinen Code ausführe, bekomme ich den Fehler "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt". Ist das, weil ich nicht verwenden sollte:

public User User { get; set; }

um auf die username-Eigenschaft zuzugreifen, oder sollte ich eine neue Klasse mit einem Benutzernamenfeld erstellen. Jede Eingabe würde geschätzt werden.

Akzeptierte Antwort

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

Ich wette, das Problem ist in dieser Zeile: <p>@post.User.Username</p> und das liegt daran, dass Sie das User-Objekt nicht zugeordnet haben. Sie sollten diesen Code ändern:

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

zu diesem:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum