在實體框架核心中使用Include

asp.net-mvc entity-framework-core linq-to-entities

問題 :在下面PostControllerInxex.cshtml view中使用的Inxex.cshtml view中, Index()動作方法中使用的擴展方法“ Include ”的方式和位置如何?據我所知_context.Posts.Include(p => p.Blog)意味著包括與博客表相關的所有帖子。但我沒有在下面的Index.cshtml視圖中看到使用blog類or blogId屬性?

背景 :在ASP.NET MVC核心 - Code First項目中,我正在遵循這個ASP.NET官方站點教程 ,他們有以下Model類,用於Blog (父級)和Post (子級)。然後我使用MVC Controller with Views, using Entity Framework創建了一個控制器(如下所示) MVC Controller with Views, using Entity Framework嚮導,我在Model對話框中選擇了Post模型:

型號

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;

namespace EFGetStarted.AspNetCore.NewDb.Models
{
    public class BloggingContext : DbContext
    {
        public BloggingContext(DbContextOptions<BloggingContext> options)
            : base(options)
        { }

        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }

        public List<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
}

PostController

public class PostsController : Controller
{
        private readonly BloggingContext _context;

        public PostsController(BloggingContext context)
        {
            _context = context;    
        }

        // GET: Posts
        public async Task<IActionResult> Index()
        {
            var bloggingContext = _context.Posts.Include(p => p.Blog);
            return View(await bloggingContext.ToListAsync());
        }
}

PostController中Index()動作的Index.cshtml視圖

@model IEnumerable<ASP_Core_Blogs.Models.Post>

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Content)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Content)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.PostId">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.PostId">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.PostId">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

一般承認的答案

由於您沒有訪問Blog屬性,因此最好不要使用Include(p => p.Blog)。這將添加一個不需要的額外連接。但是,如果您將在每個表行中引用它,則首選包含它以避免延遲加載問題。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow