Ricerca 
it-ITen-US
Registrazione
Accedi
In-Vesti Dotnetwork
IN-VESTI DNW!!!
Sono finalmente arrivate le nuovissime T-Shirt di DotNetWork!!! Con soli 15,00 € ci sosterrai nelle spese di gestione della Community e ti invieremo a casa una splendida maglietta.
Se vuoi contribuire al mantenimento di DotNetWork.it Vai sulla pagina Iscrizioni
Effettua il pagamento usando IWBank
Click per andare alla pagina di Iscrizione
Oppure un Bonifico bancario (le coordinate sono sulla pagina Iscrizioni), inviaci una mail a support@dotnetwork.it indicandoci la tua taglia e l'indirizzo di spedizione.  Non appena verificata la ricezione del pagamento provvederemo a spedirti la tua T-Shirt.  Le magliette sono disponibili nelle taglie S-M-L-XL-XXL (in caso di esaurimento di una delle taglie, indica quella di "Backup"). Grazie per IN-VESTIRTI con NOI!!!
.:DotNetWork Founders:.
    Stampa     


DotNetWork Forums
Caricamento dati di una classe dal Database
Ultimo Post 28 giu 2010 10.15 by neodago. 7 Risposte.
Stampa immediata
Ordina:
PrevPrev ProssimoProssimo
Non sei autorizzato ad inviare una risposta.
Autore Messaggi

Posts:5

--
23 giu 2010 13.41  
Sto sviluppando un piccolo gestionale in C# (windows forms, .net 2.0, VS2008) e mi è venuto un grosso dubbio riguardo la creazione di una determinata classe e del caricamento dei dati da DB. la classe che devo implementare è la "categoria dell'articolo", piuttosto banale, ma il dubbio arriva ora: una categoria può racchiudere al suo interno altre sottocategorie e così via per un numero di livelli/nodi anche infinito; pensiamo ad esempio ad una struttura tipo questa: - Utensili |--- Cacciaviti | |--- A taglio | |--- A croce | |--- Torx |--- Chiavi Ho pensato quindi che in questa classe dovrei cosiderare tra le proprietà anche una categoria padre e una lista di categorie figlie, più o meno così: class CategoriaArticolo { public Int32 IDCategoriaArticolo { get; set; } public string DescrizioneCategoriaArticolo { get; set; } public CategoriaArticolo Parent; // Genitore public IList Children; // Figli } SUl DB la tabella della categoria è più o meno così (taglio i campi inutili all'esempio): tabella CategorieArticolo IDCategoria (int), Categoria (strinag), IDCategoriaPadre (int) Ma allora quando vado a caricare i dati di una categoria non riesco a valorizzare tutte le proprietà della classe (categoria padre e categorie figlie) se non leggendo tutti i record della tabella! Devo quindi leggerla tutta e magari tenere il tutto inmemoria? E' questa la soluzione migliore? A me pare un po' uno spreco di risorse caricare tutte le categorie in memoria quando magari devo solo modificare un'articolo... Oppure dovrei caricare i dati in modo parziale (solo la singola categoria che mi serve) e successivamente caricare il resto all'occorrenza (se devo fare delle variazioni nelle categorie)? Grazie per l'aiuto

Posts:5

--
24 giu 2010 10.12  
Mi scuso per la formattazione del post, ma durante l'anteprima (e anche in modifica) è tutto OK, non capisco perchè si veda in questo modo...

Ad ogni modo ora sto valutando l'utilizzo del pattern "lazy load" per caricare in differita i dati che potrebbero nn servirmi subito, mi sembra una buona soluzione. L'unico problemino al momento è che le classi che si occupano dell'accesso al DB sono ovviamente diverse e vorrei tenere i vari layer separati.

Posts:811

--
24 giu 2010 21.19  

Per la formattazione del codice, non saprei, mi par tanto che devi scrivere la parola code fra parentesi quadre all'inizio e la parola /code fra quadre alla fine, se è vero quello che ho scritto in fondo al post si vedrà bene  sennò  non so neppure io come funzionano i forum...

detto questo, se la quantità complessiva di righe che puoi ottenere dal caricamento dell'intero albero è nell'ordine di un centinaio (se non lo fosse più che categorie sarebbero distinte base...) puoi caricare tutto subito e in questi casi io uso una bellissima query ricorsiva (se hai almeno sql 2005 come DB) che mi permette un flat load di tutta la tree.
Se non fossero un centinaio ma molte di più, puoi caricare la tree per livelli facendo una query a cui passi l'ID del nodo padre e carichi il primo livello dei figli e puoi mappare l'esecuzione della sub query solo quando viene espanso uno dei nodi.
saluti
Sabrina


[code]
public class pippo
{
      if( this.pluto == true)
      {
            A=B;
       }
}
[/code]

Sabrina

Posts:5

--
25 giu 2010 08.49  

Grazie Sabrina per l'aiuto, penso che opterò per una soluzione mista: caricare solo un livello alla volta (quello che mi serve) ed il resto all'occorrenza.
Ti chiedo solo un altro piccolo aiuto per quanto riguarda il pattern lazy load che vorrei comunque implementare anche per altre classi.

Ponendo che la classe "Categoria" esponga la proprietà "Children" ( IList ) più o meno in questo modo:

private IList < CategoriaArticolo >   _children;

public IList < CategoriaArticolo >   Ordini
{
    get
    {
        if _children == null)
        {
            _children = Utility.CaricaCategorieArticoli(this._idCategoriaArticolo);
        }

        return _children;
    }
    set
    {
        _children = value;
    }
}
...

Tutto funzionerebbe, peccato però che la "Utility.CaricaCategorieArticoli(int ID)" si trova in un altro layer e non è visibile dalla classe "Articolo". Ci deve essere qualche soluzione utilizzando delle interfacce e/o dei delegate, potresti per cortesia indicarmi un esempio pratico?

Grazie, Alberto


Posts:811

--
25 giu 2010 09.14  
Non ho capito bene cosa intendi dire con layer, se la classe Utility che presumo sia un helper è pubblica per chiamarla dalla tua classe devi sapere il suo namespace e se si trova su una Dll diversa (e per layer intendi questo) devi fare un reference alla dll nel progetto dove hai inserito la classe che espone le categorie.

Inoltre, per quanto i generics siano una delle cose + belle di .Net perché non fare una classe tipizzata?

[code]
public class CategorieArticoli : IList
{
     ...
}
[/code]

saluti
Sabrina
Sabrina

Posts:5

--
25 giu 2010 09.53  

Con 'layer' mi sono espresso male, intendevo dire che vorrei tenere il più possibile separati il Business Objects che contiene le classi e il Data Access Layer (DAL) che si occupa dei caricamenti dal DB, per questo motivo non mi andava molto di referenziare direttamente all'interno di una classe di BO un metodo proveniente dal DAL, tutto qui.

Per quando riguarda le classi tipizzate invece, di solito le faccio, intendo ereditare da una IList, ma di solito non sviluppo molti metodi interni a quelle collezioni, quindi è più il tempo che perdo a ceare nuove classi che non quello che ci metto a fare un paio di metodi per gestire quelle standard. Tutto dipende dal progetto ovviamente...

Alberto

Posts:811

--
26 giu 2010 13.00  
Solo due osservazioni di tipo filosofico e molto personale:

Separare i layer è buona cosa farsi delle paranoie sul referenziare oggetti può portare a creare codice inusabile e incomprensibile, pertanto separare si, ma non referenziare per me no.

Creare un oggetto con un nome, cognome e ubicazione (vedasi classe) per quanto ti faccia perdere tempo a scrivere alcune cose a mano (io uso degli snippet per le collection e le entity che mi fanno il 90 percento del lavoro) non è mai tempo sprecato ai fini della leggibilità e soprattutto della manutenibilità ed eventuale espansione, aggiornamento ecc. futuro.

Ovviamente ciascuno è libero di scegliere.

saluti
Sabrina

Posts:5

--
28 giu 2010 10.15  
Grazie Sabrina per le osservazioni.
;-)
Non sei autorizzato ad inviare una risposta.

Active Forums 4.1
       
Articoli
Fritto Misto - Classi di uso comune(parte 4)
Helper: Una classe per il log di eventi, con evento, event handler, enumerazione.
2007/10/24 | Autore: Sabrina Cosolo
Fritto misto - Classi di uso comune (parte 1)
Helper: Una classe per operare sulle stringhe
2007/10/20 | Autore: Sabrina Cosolo
SQL Server 2000/2005 Manutenzione Database
Uso di DBCC ShowContig e di sys.dm_db_index_physical_stats
2007/08/05 | Autore: Sabrina Cosolo
SQL Server Nozioni base (parte 2)
Come creare un database in SQL Server Usando solo il codice SQL
2008/03/09 | Autore: Sabrina Cosolo
Le nostre Librerie nella finestra .NET di Add reference
Come fare in modo di visualizzare le nostre librerie nella finestra .NET dell'Add Reference di Visual Studio
2008/07/27 | Autore: Sabrina Cosolo
Copiare dati fra Database con ADO.Net
Da Qui a Li e da Li a Qui usando OleDb e Access
2009/02/14 | Autore: Sabrina Cosolo
Unit testing del codice (parte 2)
Generiamo alcuni unit test per la libreria Helper base ADO.NET
2008/03/09 | Autore: Sabrina Cosolo
Ereditarietà applicata ai controlli
Creazione di una combobox che mostra immagini al posto del testo
2008/07/06 | Autore: Andrea Zingoni
    Stampa     
Home|Forums|Blogs|Mappa del sito
© 2007-2010 by DotNetWork  .:.  Condizioni d'uso  .:.  Privacy  .:.  Accedi  .:.