2017-07-12 1 views
1

Je suis en train de convertir mon modèle .NET MVC5 en .NET Core MVC modèle de ASPNETZERO. Donc, tout le code que je convertis fonctionne exactement comme j'ai besoin de ma solution de template MVC5. Mon code de méthode est montré ci-dessous.ASPNETBOILERPLATE - Méthode de service d'application ne renvoyant pas d'entités liées dans .NET Core

public async Task<EditCompanyDto> GetCompanyForEdit(NullableIdDto input) 
    { 
     var companyEditDto = (await _companyRepository.GetAsync((int)input.Id)); 
     var cmp = companyEditDto.MapTo<EditCompanyDto>(); 
     return cmp; 
    } 

Ce code fonctionne parfaitement dans le modèle MVC5 et renvoie les entités connexes d'adresse, de contact et de note. Dans la solution .NET Core, ce même code renvoie uniquement les collections Address et Contact dans la méthode ci-dessus. Il continue à renvoyer la collection Note comme NULL.

L'illustration ci-dessous représente l'entité de mon entreprise. J'ai supprimé certains champs pour ce post, mais j'ai laissé toutes les propriétés de navigation.

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>(); 
    } 

} 
+0

Le chargement différé n'est pas pris en charge par EF Core. https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading –

+0

Oui, je suis conscient de cette limitation. Toutefois, les contacts et les collections d'adresses sont renvoyés avec mon appel GetAsync(). C'est juste l'entité de note qui revient null. Je ne comprends pas cela? – exlnt

+0

@exlnt vous pouvez vous référer à https://stackoverflow.com/a/48403796/6527049 –

Répondre

1

Vous dites collection Note. Pour autant que je vois Remarque n'est pas collection. Supposons que c'est la collection. L'approche de Gabriel est correcte. Mais n'a pas inclus le champ Note. En conséquence votre code devrait être comme ça

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

Note: GetAll() ne signifie pas que vous saisissez toutes les données de base de données. GetAll() renvoie IQueryable. Ainsi, vous pouvez ajouter des méthodes Linq après cela. Mais si vous utilisez GetAllList(), oui il récupère toutes les données de la table.

2

Essayez de charger votre collection à l'aide de la méthode Include.

Vous pouvez l'utiliser comme ceci:

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

Merci! Je suis conscient de la fonctionnalité de chargement paresseux étant N/A dans le noyau .Net. J'ai aussi trouvé la méthode include. Cependant, mon souci avec l'utilisation de cette approche est ce que cela va faire pour les performances de mon application, si chaque méthode "GetForEdit" utilisera GetAll()? Cela ne charge-t-il pas beaucoup de données sans raison? Certes, il y aura un prix de performance à payer pour cela. Cela ne semble pas être une conception durable qui pourrait augmenter, une fois que l'application a de gros volumes de données. – exlnt

+0

Votre solution a très bien fonctionné, merci! Cependant, la préoccupation concernant la performance de cette option me préoccupe toujours. – exlnt

+0

@exlnt Vous pouvez avoir plusieurs méthodes de service d'application. Un qui inclura la collection, les autres pas. –

1

@Alper Merci! L'entité NoteHeader contient une collection de NoteDetails, à l'emplacement de la collection de notes. J'ai déjà implémenté la suggestion de code de @ Gabriel et je l'ai ajouté, pour obtenir exactement ce dont j'avais besoin.

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);