2011-09-13 36 views
0

我有一個簡單的視圖模型具有這樣的事情...錯誤而訪問導航屬性在EF代碼第一次

視圖模型

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視圖與視圖模型,這樣我可以在一個視圖中返回所有三個模特屬性...

但:(我想在該特定帖子的每條評論前面顯示userName而不是userID。所以我在viewmodel中使用ICollection註釋,以便我可以返回註釋的集合。當我嘗試訪問像這樣@ Model.Comments.User.LastName /或電子郵件/或名字的用戶名屬性..我收到編譯錯誤。 ,我不能這樣使用,因爲它集合類型...

我如何使用正在評論中可用的用戶ID ..

請幫助...檢索意見實體將用戶名

心動不如通過在局部視圖中添加工作..

_comments管窺..

在我添加了一些類似這樣的我的部分觀點...

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

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

} 

回答

0

您可以創建一個局部視圖來顯示評論,並呼籲,在一個循環內主視圖。

後詳細查看

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

型號發出

你需要讓虛擬偷懶裝的導航性能。

public class Comment 
{ 
    //other properties 

    public virtual User User { get; set; } 

    public virtual Post Posts { get; set; } 
} 

如果你要訪問這些導航屬性,那麼你需要加載它們。否則,你會遇到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(); 
+0

嘿..謝謝...我試過這個,並得到以下錯誤... 對象引用未設置爲對象的實例。 描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。 異常詳細信息:System.NullReferenceException:未將對象引用設置爲對象的實例。

它的一個空引用異常... –

+0

@ patel.milanb看到我的編輯答案 – Eranga

+1

好...我用這樣的事情,現在它的工作......從你的答案學到新的方法,雖然。 。thx共享+1 –