以多对多关系查看项目的详细信息

时间:2019-10-30 16:57:23

标签: asp.net asp.net-mvc asp.net-core entity-framework-core

伙计们。我需要的只是在“查看ArticleDetail”中查看有关我的Article的详细信息。一切正常,除了标签。我的文章和标签之间有多对多的关系:

     public class Article
{        
    public int Id {get; set; }

    public string Name { get; set; }
    public string ShortDescription { get; set; }
    public string Description { get; set; }
    public byte[] HeroImage { get; set; }        
    public DateTime Date { get; set; }
    public string Category { get; set; }

    public virtual List<ArticleTag> ArticlesTags { get; set; }
    public Article()
    {
        ArticlesTags = new List<ArticleTag>();
    }
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual List<ArticleTag> ArticlesTags { get; set; }

    public Tag()
    {
        ArticlesTags = new List<ArticleTag>();
    }
}

public class ArticleTag
{
    public int ArticleId { get; set; }
    public Article Article { get; set; }

    public int TagId { get; set; }
    public Tag Tag { get; set; }
}

我的ArticleDetail是:

    @model MyBlog.Models.Article
@{
    ViewData["Title"] = "Article Detail";
}
<div>
    <dl class="dl-horizontal">
        <dt></dt>
        <dd>
            @Html.DisplayFor(model => model.Name)
        </dd>

        <dt></dt>
        <dd>
            @Html.DisplayFor(model => model.Description)
        </dd>

        <dt></dt>
        <dd>
            @foreach (var t in Model.ArticlesTags)
            {@t.Tag.Name}  //?? is it right?

        </dd>

        <dt></dt>
        <dd>
            @Html.DisplayFor(model => model.Category)
        </dd>
    </dl>   
</div>

但是我应该如何更改HomeController(现在我只有一个用于查看有关文章的详细信息而没有任何标签)?

  [HttpGet]
    [ActionName("ArticleDetail")]
    public async Task<IActionResult> ArticleDetail(int? id)
    {
        if (id != null)
        {
            Article article = await db.Articles.FirstOrDefaultAsync(i => i.Id == id);
            if (article != null)
                return View(article);
        }
        return NotFound();
    }

1 个答案:

答案 0 :(得分:0)

您需要做的就是要求EF将ArticleTagsArticle一起获得。

幸运的是,您可以使用实体模型中的导航属性通过使用IncludeThenInclude方法来加载ArticleTags来加载想要的相关数据,然后再加载Tags位于文章标签内。

例如:

Article article = await db.Articles.Include(a => a.ArticlesTags).ThenInclude(at => at.Tag).FirstOrDefaultAsync(i => i.Id == id);

您可以阅读有关Loading Related Data here

的信息