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 -