ASPNETBOILERPLATE - 应用程序服务方法不返回 .NET Core 中的相关实体
ASPNETBOILERPLATE - App service method not returning related entities in .NET Core
我正在将我的 .NET MVC5 模板转换为 ASPNETZERO 的 .NET Core MVC 模板。因此,我正在转换的所有代码都按照我在 MVC5 模板解决方案中的需要工作。我的方法代码如下。
public async Task<EditCompanyDto> GetCompanyForEdit(NullableIdDto input)
{
var companyEditDto = (await _companyRepository.GetAsync((int)input.Id));
var cmp = companyEditDto.MapTo<EditCompanyDto>();
return cmp;
}
此代码在 MVC5 模板和 returns Address、Contact 和 Note 的相关实体中完美运行。在 .NET Core 解决方案中,此完全相同的代码 returns 只是上述方法中的 Address 和 Contact 集合。它一直将 Note 集合返回为 NULL。
下面显示的是我的公司实体。我为此 post 删除了一些字段,但保留了所有导航属性。
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>();
}
}
尝试使用 Include 方法加载您的 collection。
你可以这样使用它:
var company = _companyRepository.GetAll()
.Include(c => c.Addresses)
.Include(c => c.Contacts)
.FirstOrDefault(x => x.Id == input.Id);
你说注意collection。据我所知,注释 不是 collection。假设它是 collection。
加布里埃尔的做法是正确的。但不包括注释字段。因此你的代码应该是这样的
var company = _companyRepository.GetAll()
.Include(c => c.Addresses)
.Include(c => c.Contacts)
.Include(c => c.Note)
.FirstOrDefault(x => x.Id == input.Id);
注意: GetAll() 并不意味着您从数据库中获取所有数据。 GetAll() returns IQueryable。因此,您可以在它之后添加 Linq 方法。但是,如果您使用 GetAllList(),是的,它会从 table.
获取所有数据
@Alper 谢谢! NoteHeader 实体包含 NoteDetails 的集合,即笔记集合所在的位置。我已经实施了@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);
我正在将我的 .NET MVC5 模板转换为 ASPNETZERO 的 .NET Core MVC 模板。因此,我正在转换的所有代码都按照我在 MVC5 模板解决方案中的需要工作。我的方法代码如下。
public async Task<EditCompanyDto> GetCompanyForEdit(NullableIdDto input)
{
var companyEditDto = (await _companyRepository.GetAsync((int)input.Id));
var cmp = companyEditDto.MapTo<EditCompanyDto>();
return cmp;
}
此代码在 MVC5 模板和 returns Address、Contact 和 Note 的相关实体中完美运行。在 .NET Core 解决方案中,此完全相同的代码 returns 只是上述方法中的 Address 和 Contact 集合。它一直将 Note 集合返回为 NULL。
下面显示的是我的公司实体。我为此 post 删除了一些字段,但保留了所有导航属性。
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>();
}
}
尝试使用 Include 方法加载您的 collection。
你可以这样使用它:
var company = _companyRepository.GetAll()
.Include(c => c.Addresses)
.Include(c => c.Contacts)
.FirstOrDefault(x => x.Id == input.Id);
你说注意collection。据我所知,注释 不是 collection。假设它是 collection。 加布里埃尔的做法是正确的。但不包括注释字段。因此你的代码应该是这样的
var company = _companyRepository.GetAll()
.Include(c => c.Addresses)
.Include(c => c.Contacts)
.Include(c => c.Note)
.FirstOrDefault(x => x.Id == input.Id);
注意: GetAll() 并不意味着您从数据库中获取所有数据。 GetAll() returns IQueryable。因此,您可以在它之后添加 Linq 方法。但是,如果您使用 GetAllList(),是的,它会从 table.
获取所有数据@Alper 谢谢! NoteHeader 实体包含 NoteDetails 的集合,即笔记集合所在的位置。我已经实施了@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);