【问题标题】:Does .net core handle related look up differently than standard asp.net mvc for child records?.net 核心处理相关查找与子记录的标准 asp.net mvc 不同吗?
【发布时间】:2018-06-01 14:02:19
【问题描述】:

在我的一个观点中,我有一系列子表,其中子表具有相关的查找,即不是孙表。相关查找是对代码的描述。在标准的 asp.net mvc 中,我可以指向该相关表并在该子记录中显示描述。在 .net 核心中,它显示为空白。如果我只是在子记录中显示代码,它就可以工作。

我错过了什么吗? 模型、控制器和视图代码如下:

有效的传统 asp.net mvc: 型号

Model

namespace ServeMeHR.Models
{
    using System;
    using System.Collections.Generic;

    public partial class TeamAssignmentHistory
    {
        public int Id { get; set; }
        public string AssignedBy { get; set; }
        public System.DateTime DateAssigned { get; set; }
        public int ServiceRequest { get; set; }
        public int Team { get; set; }

        public virtual ServiceRequest ServiceRequest1 { get; set; }
        public virtual Team Team1 { get; set; }
    }
}

相关控制器部分

public async Task<ActionResult> Details(int? id)
    {
        ViewBag.FileUp = db.ApplicConfs.Select(s => s.FileSystemUpload).FirstOrDefault();

        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        ServiceRequest serviceRequest = await db.ServiceRequests.FindAsync(id);
        if (serviceRequest == null)
        {
            return HttpNotFound();
        }
        return View(serviceRequest);
    }

相关视图部分

<div id="tabs-2">
            <table class="table">
                <tr>
                    <th>Assigned BY</th>
                    <th>Date Assigned</th>
                    <th>Team</th>
                </tr>
                @foreach (var item in Model.TeamAssignmentHistories)
                {
                    <tr>
                        <td>
                            @Html.DisplayFor(modelItem => item.AssignedBy)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.DateAssigned)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Team1.TeamDescription)
                        </td>
                    </tr>
                }
            </table>
        </div>

对于 .Net Core - 这不起作用

型号

    using System;
using System.Collections.Generic;

namespace ServeMeHRCore21.Models
{
    public partial class TeamAssignmentHistories
    {
        public int Id { get; set; }
        public string AssignedBy { get; set; }
        public DateTime DateAssigned { get; set; }
        public int ServiceRequest { get; set; }
        public int Team { get; set; }

        public ServiceRequests ServiceRequestNavigation { get; set; }
        public Teams TeamNavigation { get; set; }
    }
}

相关控制器代码

Relevant part of controller



// GET: ServiceRequests/Details/5
    public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var serviceRequests = await _context.ServiceRequests
            .Include(s => s.MemberNavigation)
            .Include(s => s.PriorityNavigation)
            .Include(s => s.RequestTypeNavigation)
            .Include(s => s.RequestTypeStepNavigation)
            .Include(s => s.StatusNavigation)
            .Include(s => s.TeamNavigation)
            .Include(s => s.FileDetails)
            .Include(s => s.ServiceRequestNotes)
            .Include(s => s.StepHistories)
            .Include(s => s.TeamAssignmentHistories)
            .Include(s => s.IndividualAssignmentHistories)
            .AsNoTracking()
            .SingleOrDefaultAsync(m => m.Id == id);
        if (serviceRequests == null)
        {
            return NotFound();
        }

        return View(serviceRequests);
    }

视图的相关部分

<div id="tabs-2">
            <table class="table">
                <tr>
                    <th>Assigned BY</th>
                    <th>Date Assigned</th>
                    <th>Team</th>
                </tr>
                @foreach (var item in Model.TeamAssignmentHistories)
                {
                    <tr>
                        <td>
                            @Html.DisplayFor(modelItem => item.AssignedBy)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.DateAssigned)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.TeamNavigation.TeamDescription)
                        </td>
                    </tr>
                }
            </table>
        </div>

以上视图显示团队描述为空白。每一个的代码几乎相同......

【问题讨论】:

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


    【解决方案1】:

    根据您运行的 EF Core 版本,有多种解决方案。在 EF 6(您在 ASP.NET MVC 中使用的)中,带有 virtual 关键字的引用/收集属性参与延迟加载。 EF 动态子类化您的实体类,覆盖引用/集合属性(这就是为什么需要virtual)并添加逻辑以在 getter 被命中时查询数据库。然后,当您在应用程序中访问此属性时,如果该关系不可用,EF 会透明地查询并填充它,看起来它始终已设置并准备就绪。

    在 EF Core 2.1 之前,延迟加载根本不是一种选择。要使这些属性具有值,您需要急切地或显式地加载它们:

    预加载

    var foo = await _context.Foos.Include(x => x.Bar).SingleOrDefaultAsync(x => x.Id == fooId);
    

    显式加载

    var foo = await _context.Foos.SingleOrDefaultAsync(x => x.Id == fooId);
    await _context.Entry(foo).Reference(x => x.Bar).LoadAsync();
    // use `Collection` rather than `Reference` for a collection type
    

    EF Core 2.1 现在支持延迟加载,但您仍然需要 virtual 关键字,目前您的实体类引用/集合属性中没有该关键字。另外,您需要在 Startup.cs 中添加相应的服务:

    services.AddDbContext<MyContext>(
        b => b.UseLazyLoadingProxies()
              .UseSqlServer(myConnectionString));
    

    但是,我建议您避免走这条路,尤其是因为您似乎没有意识到我提到的任何事情实际上都发生在 EF 6 的幕后。懒惰很容易 -加载以创建各种问题,例如可能导致应用程序出现重大问题的 N+1 查询。急切地加载任何相关实体几乎总是更好,因此您可以组合查询。仅仅因为 EF Core 现在支持延迟加载,并不意味着您需要使用它。

    【讨论】:

    • 谢谢。我也注意到,我仍在使用 net core 2.0。将进行上述建议的更改并重试...
    • 将目标更改为 net core 2.1 进行了上述更改并且有效。感谢您对此的理解
    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多