Ошибка при доступе к свойству навигации в EF Code First - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть простая ViewModel, которая имеет что-то вроде этого ...

ViewModel

public class UserPostCommentViewModel
    {

        public virtual List<Comment> Comment { get; set; }

        public virtual User User { get; set; }

        public virtual Post Post { get; set; }
    }

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

POST

 [Key]
        [ScaffoldColumn(true)]
        public int PostID { get; set; }

        [Required(ErrorMessage="Required")]
        [StringLength(250)]
        public string Title { get; set; }

        [Required(ErrorMessage="Required")]
        [DataType(DataType.MultilineText)]
        public string Body { get; set; }

        [DataType(DataType.Date)]
        public DateTime DateCreated { get; set; }

        [DataType(DataType.Date)]
        public DateTime DateModified { get; set; }

        [ScaffoldColumn(false)]
        public int UserID { get; set; }

        [ScaffoldColumn(false)]
        public int? TagID { get; set; }

        public virtual ICollection<Comment> Comments { get; set; }

        public virtual User Users { get; set; }

        public virtual ICollection<Tag> Tags { get; set; }

Комментарий

[Key]
        [ScaffoldColumn(true)]
        public int CommentID { get; set; }

        [DisplayName("Your Comment")]
        [DataType(DataType.MultilineText)]
        public string Body { get; set; }

        [DataType(DataType.Date)]
        [ScaffoldColumn(true)]
        public DateTime DateCreated { get; set; }

        [ScaffoldColumn(true)]
        public int PostID { get; set; }

        [ScaffoldColumn(true)]
        public int UserID { get; set; }

        public User User { get; set; }

        public Post Posts { get; set; }

Пользователи

[ScaffoldColumn(true)]
        [Key]
        public int UserID { get; set; }

        [StringLength(15)]
        [DisplayName("First Name")]
        [Required(ErrorMessage="First Name is Required")]
        public string FirstName { get; set; }

        [StringLength(15)]
        [DisplayName("Last Name")]
        [Required(ErrorMessage = "Last Name is Required")]
        public string LastName { get; set; }

        [DataType(DataType.EmailAddress,ErrorMessage="please enter valid email")]
        [DisplayName("Email Address")]
        [Required(ErrorMessage = "Email is Required")]
        [Remote("CheckUniqueEmail","User",ErrorMessage="An account with this email address already exists.")]
        public string Email { get; set; }

        [DataType(DataType.Password)]
        [Required(ErrorMessage = "Password is Required")]
        public string Password { get; set; }

        [DataType(DataType.Date)]
        [ScaffoldColumn(true)]
        public DateTime JoiningDate { get; set; }

        [DataType(DataType.Date)]
        [ScaffoldColumn(true)]
        public DateTime? LastActivityDate { get; set; }

        public virtual ICollection<Post> Posts { get; set; }

        public virtual ICollection<Comment> Comments { get; set; }

        public virtual ICollection<Tag> Tags { get; set; }

У меня StronglyTyped View с ViewModel, так что я могу вернуть все три свойства модели в одном представлении ...

НО :( я хочу показать userName вместо userID перед каждым комментарием для этого конкретного поста. Поэтому я использую комментарии ICollection в viewmodel, чтобы я мог вернуть коллекцию комментариев. И когда я пытаюсь получить доступ к свойству userName, как это @ Model.Comments.User.LastName // ИЛИ электронная почта // ИЛИ FirstName .. Я получаю ошибку компиляции. И я не могу использовать это, потому что это тип коллекции ...

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

помогите пожалуйста ...

Все получилось, добавив в частичное представление ..

_Comments Частичное представление ..

в своем частичном представлении я добавил вот так ...

========================

@{
    ContextRepository db = new ContextRepository();
    var userID = Model.UserID;
    var userName = db.EUser.Find(userID).FirstName;   

}

1 Ответ

0 голосов
/ 14 сентября 2011

Можно создать частичное представление для отображения комментария и вызвать его внутри цикла в главном представлении.

Представление сведений о сообщении

@model UserPostCommentViewModel
@{
    ViewBag.Title = "Post";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@foreach (Comment comment in Model.Comments)
{
    @Html.Partial("_Comment", comment);
}

_Comment частичное представление

@model Comment

<div class="comment">
    <div class="desc">@Model.Body</div>

    <div class="submitted-by">@Model.User.LastName</div>
</div>

Проблемы с моделью

Вам необходимо сделать навигационные свойства виртуальными, чтобы загружать их с отложенным доступом.чтобы получить доступ к этим навигационным свойствам, вам нужно загрузить их.В противном случае вы столкнетесь с проблемой Select n+1.Используйте метод Include для загрузки свойств загрузки

var post = db.Posts.Include(p => Comments)
            .Include(p => p.Comments.Select(c => c.User))
            .Where(p => p.PostID == 1).Single();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...