Dapper - ссылка на объект не установлена ​​в экземпляр объекта

asp.net-mvc-4 dapper sql

Вопрос

Я недавно играл с dapper, но у меня возникла проблема с получением данных из других таблиц.

В моей базе данных есть две таблицы: «Пользователи» и «Почта». Я создал два класса для этих таблиц.

Мой пользовательский класс

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

Класс My Post

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

Это мой запрос, чтобы получить все данные почты из моей базы данных, а также получить имя пользователя, создавшего сообщение.

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

Вот мой код просмотра, где я хочу отображать информацию:

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

Однако, когда я запускаю свой код, я получаю ошибку «Ссылка на объект, не установленную на экземпляр объекта». Это потому, что я не должен использовать:

public User User { get; set; }

для доступа к свойству имени пользователя или для создания нового класса с полем имени пользователя. Любой вход был бы оценен.

Принятый ответ

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

Бьюсь об заклад, проблема в этой строке: <p>@post.User.Username</p> и это связано с тем, что вы не сопоставляли объект User. Вы должны изменить этот код:

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

к этому:

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


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему