Entity Frameworkコアにインクルードを使用する

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

質問

質問 :以下のInxex.cshtml view使用されるPostControllerIndex()メソッドアクションメソッドで使用される拡張メソッド " Include "はどのようにしてどこで使用されますか?私が理解している_context.Posts.Include(p => p.Blog)は、ブログテーブルに関連するすべての投稿を含みます。しかし、私は下のIndex.cshtmlビューでブログクラスor blogIdプロパティを使用することはありませんか?

背景 :ASP.NET MVC Core - Code Firstプロジェクトでは、 Blog (親)とPost (子)のModelクラスに従うこのASP.NET公式サイトのチュートリアルに従っています。次に、モデルダイアログボックスでPostモデルを選択MVC Controller with Views, using Entity FrameworkウィザードMVC Controller with Views, using Entity Framework使用してコントローラを作成しました(下図参照)。

モデル

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
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ