18 messaggi dal 30 gennaio 2014
Buongiorno.
Mi sono piantato su un problema che non riesco a risolvere.
Uso Entity Framework e .net 6. Ho una entità che si chiama "Centers" ed è scritta così:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace WaseNet6.Models.Entities
{
    public class Centers
    {
        public int IdCenter { get; set; }
        public string CenterCode { get; set; }
        public string Insegna { get; set; } //nome esteso del centro
        [StringLength(35)]
        public string ShortName { get; set; } //nome breve per il brevetto
        public int Luogo { get; set; }
        public string Email { get; set; }
        [StringLength(100)] 
        public string Pec { get; set; }
        [StringLength(40)]
        public string Telefono { get; set; }
        [StringLength(40)]
        public string Fax { get; set; }
        public string CodFis { get; set; }
        public string Sito { get; set; }
        public bool? Attivo { get; set; }
        public DateTime? Data1Affiliazione { get; set; }
        public int Inseritore { get; set; }
        public DateTime DataInserimento { get; set; }

        //Relazioni
        public ICollection<CentriStampa> CentriStampa { get; set; }
        public ICollection<RinnoviCentri> CenterRenew { get; set; }
        public ICollection<CenterXType> centerXTypes { get; set; }
        public ICollection<Associazioni> CentroXUtente { get; set; }
    }
}

e nelle relazioni faccio riferimento alla entità "RinnoviCentri" (relazione uno a molti):
using System;

namespace WaseNet6.Models.Entities
{
    public class RinnoviCentri
    {
        public int IdRinnovoCentro { get; set; }
        public int IdCentro { get; set; }
        public int IdAgenzia { get; set; }
        public int IdLivello { get; set; }
        public DateTime DataInizio { get; set; }
        public DateTime? DataFine { get; set; }
        public int Inseritore { get; set; }
        public DateTime DataInserimento { get; set; }
        public bool IsITF { get; set; }

        //Relazioni
        public virtual Centers Centro { get; set; }
        public virtual CenterLevel Level { get; set; }
        public virtual Agenzie Agenzia { get; set; }
    }
}

Questa è una parte del dbcontext dove mappo le relazioni:
 modelBuilder.Entity<RinnoviCentri>(
                entity =>
                {
                    entity.ToTable("t_rinnovicentri");
                    entity.HasKey(cl => cl.IdRinnovoCentro);
                    entity.HasOne(c => c.Centro).WithMany(cl => cl.CenterRenew).HasForeignKey(cl => cl.IdCentro);
                    entity.HasOne(l => l.Level).WithMany(lc => lc.Centri).HasForeignKey(cl => cl.IdLivello);
                    entity.HasOne(a => a.Agenzia).WithMany(rc => rc.Rinnovi).HasForeignKey(rc => rc.IdAgenzia);
                    entity.Property(rc => rc.DataInserimento).HasDefaultValueSql("CURRENT_TIMESTAMP");
                    entity.Property(rc => rc.IsITF).HasDefaultValue(0);
                });

Ora, io nel model ho una procedura che mi restituisce un elenco di centri (per una autocomplete) e ricava i dati in questo modo:
 public async Task<List<AutocompleteViewModel>> GetCentersForCardIssue(string prefix)
        {
            IQueryable<Entities.Centers> baseQuery = dbContext.Centri
                .AsNoTracking()
                .Include(c => c.CenterRenew.Take(1).OrderByDescending(c => c.DataFine))
                .OrderBy(c => c.Insegna)
                .Where(c => c.Insegna.StartsWith(prefix));

            List<AutocompleteViewModel> listaCentri = await baseQuery
                .Select(ac => centersFactory.ACCentersForCardIssue(ac))
                .ToListAsync();

            return listaCentri;
        }

E, ovviamente, uso una classe factory che prende i dati dalla query eseguita e mi restituisce la autocompeteViewModel:
using System;
using WaseNet6.Models.Entities;
using WaseNet6.Models.ViewModels;

namespace WaseNet6.Models.Factories
{
    public class CentersFactoryService : ICentersFactoryService
    {
        public AutocompleteViewModel ACCentersForCardIssue(Centers centro)
        {
            DateTime dt1 = (DateTime)centro.CenterRenew.DataFine;
            DateTime dt2 = DateTime.Now;
            string active = dt1.Date >= dt2.Date ? "Active" : "Non active";
            return new AutocompleteViewModel()
            {
                label = $"{centro.Insegna} ({centro.CenterCode}) - {active}",
                val = centro.IdCenter
            };
        }
    }
}

Il problema è che la factory non riesce ad accedere ai membri di "CenterRenew", mentre facendo il debug la query il dato me lo ricava (ma non lo mette nei membri che ritengo condivisi) e sto tirando capocciate per capire dove sbaglio.
Qualcuno (se poi passa dove lavoro prometto di mantenere) riesce a darmi una dritta? Birra pagata....
Modificato da buttibis il 18 agosto 2022 14:13 -

Valter
18 messaggi dal 30 gennaio 2014
Buongiorno.
Mi sono risolto il problema da solo...
Alle volte. Stavo cercando di accedere in modo diretto ad una ICollection<T> quando invece avrei dovuto prima istanziare un oggetto:
 DateTime dt1;
            List<RinnoviCentri> objcoll = centro.CenterRenew.ToList();
            if(objcoll.Count >0)
            {
                dt1 = (DateTime)objcoll.FirstOrDefault().DataFine;
            }
            else
            {
                dt1 = DateTime.Parse("1900-01-01");
            }
            DateTime dt2 = DateTime.Now;
            string active = dt1.Date >= dt2.Date ? "Active" : "Non active";

Valter

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.