ASP.Net使用一个控制器创建两个模型

时间:2015-05-09 21:03:45

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我只是想创建一个可以使用两个模型的控制器。 评论模型:

free

发布模型:

 public class Comment
 {
    public int ID { get; set; } // property
    public int PostID { get; set; }
    public String Title { get; set; }
    public String Name { get; set; }
    public Uri Url { get; set; }
    public String Text { get; set; }
    public Post Post { get; set; }
}

public class CommentDBContext : DbContext 
{
    public DbSet<Comment> Comments { get; set; }

    public System.Data.Entity.DbSet<BlogShauli.Models.Post> Posts { get; set; }

}

现在我想创建一个可以同时使用这两种模型的单一控制器。 我读到这样做的方法是使用ViewModel Pattern,所以我创建了另一个名为“ BlogViewModel.cs ”的模型类,其代码如下:

  public class Post
  {
    public int ID { get; set; } // property
    public String Title { get; set; }
    public String Author { get; set; }
    public String AuthorSite { get; set; }
    public DateTime ReleaseDate { get; set; }
    public String Text { get; set; }
 }

public class PostDBContext : DbContext
{
    public DbSet<Post> Posts { get; set; }
}

但是从这里我不明白是做什么的。我正在尝试使用Entity框架创建一个新的Controller,但我不知道在“数据上下文类”中选择什么。谁能解释我如何在两个模型和控制器之间建立连接?谢谢!

3 个答案:

答案 0 :(得分:1)

您只需要一个控制器:发布。

由于评论与Post相关,您可以创建关系并使用EF进行映射。因此,您的帖子将包含评论列表,可以根据您的选择热切或懒惰地检索。所以谷歌的EF一对多关系,在你的帖子中创建一个IEnumerable的虚拟属性,并从任何模型返回。

除非我在这里遗漏了什么,否则你不需要ViewModel ......至少不能解决这个问题。在涉及组织时,ViewModel非常有用。

答案 1 :(得分:1)

请在您的存储库类中尝试以下操作 -

public MotorcycleViewModel GetModelData(int commentId, int postId)
{
    MotorcycleViewModel result =new MotorcycleViewModel();
    using (var context = new CommentDBContext())
    {
       var post = (from pst in context.Post where pst.ID == postId  select pst).FirstOrDefault();
       var comment = (from cmt in context.Comment where cmt.ID == commentId select cmt).FirstOrDefault();
       result.CommentPointer = comment;
       result.PostPointer = post;
       return result;
    }
}

请按照link查看从模型到视图模型的转换方式,反之亦然

答案 2 :(得分:0)

你可以这样做

@model MotorcycleViewModel

@Html.DisplayNameFor(x=>x.CommentPointer.Title) @Html.DisplayFor(x=>x.CommentPointer.Title)

@Html.DisplayNameFor(x=>x.PostPointer.Title) @Html.DisplayFor(x=>x.PostPointer.Title)

但是,此代码可帮助您显示两个表中的数据。 此外@TomerAro我建议您使用一个上下文,因为多个上下文可能会导致混淆