Asp.net core 对于子记录,.net核心句柄相关的查找是否与标准asp.net mvc不同?

Asp.net core 对于子记录,.net核心句柄相关的查找是否与标准asp.net mvc不同?,asp.net-core,entity-framework-core,Asp.net Core,Entity Framework Core,在我的一个视图中,我有一系列子表,其中子表有一个相关的查找-即不是孙子表。相关查找是对代码的描述。在标准asp.net mvc中,我可以指向该相关表并在该子记录中显示描述。在.NETCore中,它显示为空白。如果我只是在子记录中显示代码,它就会工作 我错过什么了吗? 模型、控制器和视图的代码如下: 工作正常的传统asp.net mvc: 模型 相关控制器部分 public async Task<ActionResult> Details(int? id) {

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

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

工作正常的传统asp.net mvc: 模型

相关控制器部分

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);
    }
公共异步任务详细信息(int?id)
{
ViewBag.FileUp=db.ApplicConfs.Select(s=>s.FileSystemUpload.FirstOrDefault();
if(id==null)
{
返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
ServiceRequest ServiceRequest=Wait db.ServiceRequests.FindAsync(id);
if(serviceRequest==null)
{
返回HttpNotFound();
}
返回视图(serviceRequest);
}
相关视图部分


指派人
指定日期
团队
@foreach(Model.TeamAssignmentHistories中的var项)
{
@DisplayFor(modelItem=>item.AssignedBy)
@DisplayFor(modelItem=>item.DateAssigned)
@DisplayFor(modelItem=>item.Team1.TeamDescription)
}

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

在EFCore2.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
显式加载

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));
services.AddDbContext(
b=>b.UseLazyLoadingProxies()
.UseSqlServer(myConnectionString));

然而,我建议你避免走这条路,特别是因为你似乎没有意识到我提到的任何事情都是在EF 6的引擎盖下发生的。延迟加载很容易产生各种问题,如N+1查询,这些问题可能会给应用程序带来重大问题。急切地加载任何相关实体几乎总是更好的,这样您就可以组合查询。仅仅因为EF Core现在支持延迟加载,并不意味着您需要使用它。

谢谢。我也注意到,我仍然在使用NetCore2.0。将进行上述建议的更改并重试…将目标更改为net core 2.1进行了上述更改,并且成功。谢谢你的理解