C# ASPNETBOILERPLATE-应用程序服务方法不返回.NET核心中的相关实体

C# ASPNETBOILERPLATE-应用程序服务方法不返回.NET核心中的相关实体,c#,entity-framework-core,aspnetboilerplate,C#,Entity Framework Core,Aspnetboilerplate,我正在将.NET MVC5模板转换为ASPNETZERO的.NET核心MVC模板。因此,我正在转换的所有代码都按照我在MVC5模板解决方案中需要的方式工作。我的方法代码如下所示 public async Task<EditCompanyDto> GetCompanyForEdit(NullableIdDto input) { var companyEditDto = (await _companyRepository.GetAsync((int)input

我正在将.NET MVC5模板转换为ASPNETZERO的.NET核心MVC模板。因此,我正在转换的所有代码都按照我在MVC5模板解决方案中需要的方式工作。我的方法代码如下所示

  public async Task<EditCompanyDto> GetCompanyForEdit(NullableIdDto input)
    {
        var companyEditDto = (await _companyRepository.GetAsync((int)input.Id));
        var cmp = companyEditDto.MapTo<EditCompanyDto>();
        return cmp;
    }
公共异步任务GetCompanyForEdit(NullableIdDto输入)
{
var companyedidto=(wait _companyRepository.GetAsync((int)input.Id));
var cmp=companyedidto.MapTo();
返回cmp;
}
此代码在MVC5模板中运行良好,并返回地址、联系人和备注等相关实体。在.NET核心解决方案中,此完全相同的代码仅返回上述方法中的地址和联系人集合。它一直将便笺集合返回为NULL

下面显示的是我的公司实体。我已经删除了此帖子的一些字段,但保留了所有导航属性

public class Company : FullAuditedEntity, IMustHaveTenant
{

    public string CompanyTaxId { get; set; }

    public bool ActiveYesNo { get; set; }

    public virtual NoteHeader Note { get; set; }

    public virtual List<CompanyAddress> Addresses { get; set; }

    public virtual List<CompanyContact> Contacts { get; set; }

    public virtual int TenantId { get; set; }

    public Company()
    {
        Addresses = new List<CompanyAddress>();
        Contacts = new List<CompanyContact>();
    }

}
公共类公司:FullAuditedEntity,IMustHaveTenant
{
公共字符串CompanyTaxId{get;set;}
公共bool ActiveYesNo{get;set;}
公共虚拟记事本头说明{get;set;}
公共虚拟列表地址{get;set;}
公共虚拟列表联系人{get;set;}
公共虚拟整数租户{get;set;}
上市公司()
{
地址=新列表();
联系人=新列表();
}
}

尝试使用该方法加载您的收藏

您可以这样使用它:

var company = _companyRepository.GetAll()
                                .Include(c => c.Addresses)
                                .Include(c => c.Contacts)
                                .FirstOrDefault(x => x.Id == input.Id);

你说的是收集笔记。据我所知,Note不是集合。让我们假设它是集合。 加布里埃尔的方法是正确的。但不包括注释字段。因此,您的代码应该是这样的

var company = _companyRepository.GetAll()
                                .Include(c => c.Addresses)
                                .Include(c => c.Contacts)
                                .Include(c => c.Note)
                                .FirstOrDefault(x => x.Id == input.Id);

注意:GetAll()并不意味着您从数据库中获取所有数据。GetAll()返回IQueryable。因此,您可以在它之后添加Linq方法。但如果您使用GetAllList(),它会从表中获取所有数据。

@Alper谢谢!NoteHeader实体包含NoteDetails的集合,即note集合所在的位置。我已经实现了@Gabriel的代码建议,并实际添加了它,以获得我所需要的

var companyEditDto = _companyRepository.GetAll()
                           .Include(c => c.Addresses)
                           .Include(c => c.Contacts)
                           .Include(c => c.Note).ThenInclude(N => N.Notes)
                           .FirstOrDefault(x => x.Id == input.Id);

EF Core不支持延迟加载。是的,我知道这个限制。但是,联系人和地址集合将随我的GetAsync()调用一起返回。只是便笺实体返回空值。我不明白?@exlnt您可以参考,谢谢!我知道延迟加载特性在.NETCore中是不适用的。我也找到了include方法。然而,我担心使用这种方法会对我的应用程序的性能造成什么影响,如果每个“GetForEdit”方法都使用GetAll()?这是不是无缘无故不加载大量数据?当然,这需要付出性能上的代价。这似乎不是一个可持续的设计,一旦应用程序拥有大量的数据,它就不可能扩大。你的解决方案运行得非常好,谢谢!但是,我仍然担心此选项的性能。@exlnt您可以有多个应用程序服务方法。一个包含集合,其他的不包含。我刚刚在我的UpdateCompany方法中发现了相同的问题。其中,我有相同的代码来获取当前公司数据:var cmp=await\u companyRepository.GetAsync(input.Id);现在我也需要在这里应用相同的代码,以便获得note实体。如果我必须开始在多个方法中应用GetAll,那么这似乎不是一个好的解决方案。