2013-05-16 2 views
1

Я недавно играл с dapper, но у меня возникла проблема с получением данных из других таблиц.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; } 
} 

Мои сообщения класс

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

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

+0

Ну, есть трассировки стека, что намекает на то, что не удается? –

ответ

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

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

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

к этому:

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

Спасибо @ VON V. Я действительно понял это в ранние часы утра, но совершенно забыл обновить сообщение. С тех пор я играл с идеей получения данных из трех таблиц. Я бы использовал данные из одного запроса, а затем использовал этот результат во втором запросе? – gb1986

+0

Добро пожаловать. Я не совсем понимаю, о чем вы спрашиваете. Вы хотите сделать несколько выборок и уметь сопоставлять это с несколькими объектами? –

+0

Извините, von v, я действительно должен был объяснить это лучше. Если бы у меня было три таблицы, просто скажите «Пользователь», «Почта» и «Комментарии». Можно ли сопоставить данные из этих трех таблиц с одним объектом. Подобно запросу выше, который получает данные из двух таблиц. – gb1986