首页 > 解决方案 > 在 ASP.NET MVC EF 中构建 CRUD 功能时,如何将多对多联结表显示为实体之一的一部分?

问题描述

我正在尝试使用 EF 为一个项目搭建 CRUD 功能,其中我有一个与另一个实体具有多对多关系的实体。这在大多数情况下都可以正常工作,但我不知道如何将多对多关系数据呈现为实体之一的一部分。

我要使用的实体的脚手架模型如下所示

 public partial class Composition
    {
        public Composition()
        {
            CompFish = new HashSet<CompFish>();
        }

        public int CompositionId { get; set; }
        public int AccountId { get; set; }
        public int RodId { get; set; }
        public int ReelId { get; set; }
        public string Name { get; set; }

        public virtual Account Account { get; set; }
        public virtual Reel Reel { get; set; }
        public virtual Rod Rod { get; set; }
        public virtual ICollection<CompFish> CompFish { get; set; }
    }

这个模型有一个 HashSet 类型,它是连接表的脚手架模型,它保存与另一个实体CompFish之间的关系,看起来像这样CompositionFish

public partial class CompFish
    {
        public int CompositionId { get; set; }
        public int FishId { get; set; }

        public virtual Composition Composition { get; set; }
        public virtual Fish Fish { get; set; }
    }

所以它有一个来自它连接的每个表的 Id 和一个实体模型。

当我想在我的中显示属性的一部分时,我Fish做了以下事情;CompFishHashSetviewComposition

修改了控制器以包括CompFish

public async Task<IActionResult> Index()
        {
            var projectFishContext = _context.Composition.Include(c => c.Account).Include(c => c.Reel).Include(c => c.Rod).Include(c => c.CompFish);
            return View(await projectFishContext.ToListAsync());
        }

foreach并在我希望显示数据的视图中添加了一个循环。

@foreach (var item in Model)
{
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Account.Mail)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Reel.Brand)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Rod.Brand)
            </td>
            <td> // LOOK HERE
                @foreach (var i in item.CompFish)
                {
                    @Html.DisplayFor(modelItem => i.Fish.Species)
                }
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.CompositionId">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.CompositionId">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.CompositionId">Delete</a>
            </td>
        </tr>
}

@Html.DisplayFor(modelItem => i.Fish.Species)用来显示数据的方式很可能是错误的,由于我的主要脑力,我尝试了很多不同的方法,这就是它目前的样子。我已经有一段时间了,不知道怎么做去做吧...

任何帮助将不胜感激!

标签: c#htmlasp.net-mvcentity-frameworkrazor-pages

解决方案


public async Task<IActionResult> Index()
        {
            var projectFishContext = _context.Composition.Include(c => c.Account).Include(c => c.Reel).Include(c => c.Rod).Include(c => c.CompFish).ThenInclude(c => c.Fish);
            return View(await projectFishContext.ToListAsync());
        }

我错过了ThenInclude在我的收藏对象上添加一个


推荐阅读