Dapper - 对象引用未设置为对象实例

3

最近我一直在尝试使用Dapper,但是在获取其他表中的数据时遇到了问题。

我的数据库有两个表:Users和Post。我为这些表创建了两个类。

我的User类:

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

我的文章类

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

要访问用户名属性,我应该创建一个具有用户名字段的新类吗?任何输入都将不胜感激。


有没有堆栈跟踪提示是什么出错了? - Marc Gravell
1个回答

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

谢谢@VON V。实际上我在凌晨就已经解决了问题,但是完全忘记更新帖子了。从那时起,我一直在尝试从三个表中获取数据的想法。我应该使用一个查询的数据,然后在第二个查询中使用该结果吗? - CinnamonBun
不用客气。我不太明白你的问题。你想要进行多个选择并将其映射到多个对象吗? - von v.
抱歉 von v,我真的应该更好地解释一下。如果我有三个表,比如说用户、帖子和评论。是否可能将这三个表中的数据映射到一个对象上。类似于上面的查询,它从两个表中获取数据。 - CinnamonBun
这意味着您想要一个多地图+多结果。我也在寻找类似的东西,但是在网上找不到任何东西。所以我会分别处理这种事情。我很想看到SO的成员提供更好的替代方案。 - von v.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接