790 messaggi dal 11 febbraio 2013
in un progetto asp.net core ho tre tabelle cosi rappresentate (prive di chiave esterna)

public class Articolo
    {
        public string Codart { get; set; }
        public string Descri { get; set; }
        public string Catmer { get; set; }
        public double Prezzo { get; set; }
        ...
    }

public class Variante
    {
        public string Codart { get; set; }
        public string Codvar { get; set; }
        public string Descri { get; set; }
    }

 public class Photo
    {
        public string Codart { get; set; }
        public string FotoBig { get; set; }
        public string FotoSmall { get; set; }
}


Devo mostrare in una pagina l'articolo una sola volta con relativa immagine e tutte le eventuali varianti
accanto (oltre ovviamente a foto prezzo ecc...)


è bene creare una classe sotto la cartella ViewModels cosi?


 
 public class ArticoloView
{
  public Articolo Articolo { get; set; }
  public IEnumerable<Variante> Varianti { get; set; }
  public IEnumerable<Foto> Immagini { get; set; }
}


Pensavo di ritornare da una webapi una collection di articoloView

ma non l'ho mai fatto

apprezzo eventuali suggerimenti
Modificato da jjchuck il 15 gennaio 2019 19.14 -
790 messaggi dal 11 febbraio 2013
Ho fatto come dicevo sopra e creato una webapi
[HttpGet("Articoli/{divisione}")]
        public async Task<IActionResult> GetArticoliClienteByDivisioneAsync(string divisione)
        {
            var articoli = await new ArticoloRepository(_context)
                .GetArticoliByDivisioneAsync(divisione);

            var articoliObj = new List<ArticoloViewModel>();

            foreach (var articolo in articoli)
            {
                var articoloView = new ArticoloViewModel
                {
                    Articolo = articolo,
                    Immagini = articolo.GetFoto(articolo.Codart)
                };

                if (articolo.HasVariante(articolo.Codart))
                    articoloView.Varianti = articolo.GetVarianti(articolo.Codart);

                articoliObj.Add(articoloView);
            }

            var result = new
            {
                Total = articoliObj.Count(),
                Articoli = articoliObj
                    .OrderByDescending(a => a.Articolo.Divisione)
                    .ThenByDescending(a => a.Articolo.Number)
                    .ToArray()
            };

            return Ok(result);
        }


e nella pagina

<template v-if="articoli" id="sectionArticoli">
        <template v-for="prodotto in articoli">
            <div class="col-md-4">
                {{prodotto.articolo.Codart}} | ¤{{prodotto.articolo.Prezzo}}
                <template v-if="prodotto.immagini">
                    <template v-for="foto in prodotto.immagini">
                        <img :src="`/foto/${foto.fotoSmall}`" class="img-responsive" />
                    </template>
                </template>
                <template v-if="prodotto.varianti">
                    <template v-for="misura in prodotto.varianti">
                        {{misura.Codvar}}
                    </template>
                </template>
            </div>
        </template>
    </template>


Solo mi chiedo se sia corretto (sia che usi una webapi o una pagina razor)

quel foreach nella webapi non so se spostarlo in un repository...
125 messaggi dal 05 novembre 2012
Ciao,

prive di chiave esterna


Perché?

Mettile in relazione e te la cavi con una query linq

Ciao
Modificato da scioCoder il 01 febbraio 2019 23:36 -
Modificato da scioCoder il 01 febbraio 2019 23:36 -

Alessio
790 messaggi dal 11 febbraio 2013
Dato che aggiorno le tabelle eliminando tutti i record e poi le riempio come gestisco la cosa...mi dará errore in fase di eliminazione
125 messaggi dal 05 novembre 2012
Ti da errore se cancelli per primo gli articoli e nella foreign key non hai on delete cascade. Prima devi cancellare i record delle altre due tabelle, poi gli articoli.

Ci sono diverse soluzioni ma servono più informazioni per capire quale è la più appropiata per la tua necessità. Perché devi cancellare tutto?

Alessio
790 messaggi dal 11 febbraio 2013
nel progetto ho due database sqlite:
uno riguarda l'applicazione
l'altro serve per aggiornare i dati

esempio: leggo gli articoli dal database aziendale e ripopolo la tabella articoli che uso nel progetto
125 messaggi dal 05 novembre 2012
Con le info nuove si complica il quadro generale ed i dubbi aumentano :-)

Tralasciando perplessità che esulano dal post iniziale, vediamo se ho capito...

Le entità che hai descritto al primo post corrispondono a tabelle temporanee che vai a popolare solo ed esclusivamente per il tuo frontend, in momenti ben definiti queste tabelle vengono svuotate e ripopolate, corretto?

Per risolvere il problema dell'errore in fase di eliminazione hai due possibilità:

1) Cancelli prima le varianti e le foto e solo dopo gli articoli

2) Nel dichiarare le foreign key vai a configurare ON DELETE CASCADE, in questo modo ti basta cancellare gli articolo e di conseguenza tutte le tabelle relazionate vengono svuotate

Per un quadro più dettagliato e per evitare fraintedimenti qui puoi trovare info sulle relazione in ef https://docs.microsoft.com/en-us/ef/core/modeling/relationships

A questo punto puoi fare un unica query per recuperare i dati ed il ViewModel che hai dichiarato è superfluo, hai tutto ciò che ti serve nella lista di articoli recuperata.

Queste sono altre letture che possono tornarti utili

Gestire il Cascade Delete in Entity Framework Core http://www.linqitalia.com/script/402/Gestire-Cascade-Delete-Entity-Framework-Core.aspx

Migliorare le performance di Entity Framework Core compilando una query
http://www.linqitalia.com/script/473/Migliorare-Performance-Entity-Framework-Core-Compilando-Query.aspx

Ottimizzazione delle subquery in Entity Framework Core http://www.linqitalia.com/script/497/Ottimizzazione-Subquery-Entity-Framework-Core.aspx

Gestire l'eager loading in Entity Framework Core
http://www.linqitalia.com/script/420/Gestire-Eager-Loading-Entity-Framework-Core.aspx

Utilizzare il lazy loading
http://www.linqitalia.com/script/487/Utilizzare-Lazy-Loading-Proxy-Entity-Framework-Core-2.1.aspx
http://www.linqitalia.com/script/489/Utilizzare-Lazy-Loading-Proxy-Entity-Framework-Core-2.1.aspx
http://www.linqitalia.com/script/491/Utilizzare-Lazy-Loading-Tramite-Action-Entity-Framework-Core-2.1.aspx

Alessio
790 messaggi dal 11 febbraio 2013
Le tabelle vengono cancellate e ripopolate tutti i giorni
L'idea era tenere i due database separati
ovvero sovrascrivere il file di sqlite leggerlo e poi scriverlo nel database dell'applicazione che cosi rimane
slegato da tutto il resto.

magari è piu complicato...ma mmi sembrava sensato

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.