gestione chiavi primarie sql server

Mar 24, 2014 at 9:28 PM
Luna è un progetto fantastico però non ha una gestione delle chiavi primarie, viene gestito solo il calssico ID (autoincrement). Ci sarà un implementazione in questo senso?
Ho modificato il source per poter gestire i campi chiave
Coordinator
Mar 24, 2014 at 9:31 PM
Ciao!

Per il momento Luna gestisce solo tabelle che abbiamo un loro contatore autoincrementante o campo identity ( a seconda del database). In effetti tabelle senza una chiave Id autoincrementante ma solo primaria non l'ho proprio presa in considerazione.

Come hai modificato il codice? se me lo passi lo integro ben volentieri e faccio un nuovo pacchetto. Una mano a migliorare e' la cosa per cui esiste questo sito :)
Mar 24, 2014 at 9:38 PM
Edited Apr 8, 2014 at 10:30 AM
ho modificato il codice per poter gestire le chiavi primarie ma non il contatore autoincrement (nelle tabelle che gestisco non lo uso, ma magari si possono fondere le 2 strade), per il momento ho modificato il codice della versione 3 di Luna (non trovavo l’ultima versione, ero rimasto alla vecchia versione del sito), appena ho finito di integrarlo nell’ultima te lo passo volenieri Inviata da Windows Mail Da: [email removed] Data invio: ‎lunedì‎ ‎24‎ ‎marzo‎ ‎2014 ‎21‎:‎31 A: [email removed] From: Lunadix Ciao! Per il momento Luna gestisce solo tabelle che abbiamo un loro contatore autoincrementante o campo identity ( a seconda del database). In effetti tabelle senza una chiave Id autoincrementante ma solo primaria non l'ho proprio presa in considerazione. Come hai modificato il codice? se me lo passi lo integro ben volentieri e faccio un nuovo pacchetto. Una mano a migliorare e' la cosa per cui esiste questo sito :)
Coordinator
Mar 24, 2014 at 9:41 PM
Ottimo. Dalla 3 sono cambiate parecchie cosette, a livello di classi entity ci sono dei costruttori nuovi ma in generale li piu di tanto a memoria non dovrebbe essere cambiato.

Il grosso e' cambiato sulle transazioni , il context, e altre cosette nella gestione multithread.

Quando l'hai integrato nell'ultima versione lo metto dentro ben volentieri ;)
Mar 24, 2014 at 9:49 PM
Edited Apr 8, 2014 at 10:31 AM
bene, ti faccio sapere appena ho finito
Mar 31, 2014 at 2:31 PM
Edited Apr 8, 2014 at 10:31 AM
Ho modificato la versione di Luna 3.0.x, ho avuto delle difficoltà a modificare Luna 4 perchè le classi sono gia pre-scritte e vengono "tradotte" cambiando solo alcuni campi, in luna 3, invece, è tutto scritto a codice e poi non c'erano le transaction box. Manca ancora qualcosina al source ma la logica si capisce, in pratica nella funzione "CreaDaStrutturaMSSql" ho aggiunto/corretto la lettura delle chiavi primarie aprendo un dataTable con "MissingSchemaAction = MissingSchemaAction.AddWithKey" invece di leggere un datareader. Ho modificato le routine "AggiungiLeggi", "AggiungiElimina" e "AggiungiSalva" per gestire correttamente(con le chiavi) le chiamate, in pratica nel leggi ora si legge per chiave e non per id, nel salva all'inizio fa un Find (utilizzando la funzione Find di Luna) restituisce un array, l'unica cosa da gestire è che se nell'array ci sono piu record bisogna scorrerlo per fare l'update. Nell' elimina, idem, ora elimina per chiave e non per id. Non ho testato a fondo le modifiche ma la logica dovrebbe essere questa. Rimarrebbe da gestire l'unione dei campi autoincrement + chiave ed eventualmente in mancanza di autoincrement e chiavi leggere come chiavi gli indici primari. Chiedimi pure se hai dubbi/perplessità
Coordinator
Mar 31, 2014 at 3:10 PM
Ok ora cerco di aggiungere anche questa opzione. Nella versione 4 sono passato ai template T4 perche erano molto piu chiari e semplici per apportare modifiche al codice generato.

Il TransactionBox è uno strumento potente che voglio ancora migliorare.

Grazie innanzitutto per l'aiuto. ora Cerco di studiarmi bene come implementare questa logica nel motore nuovo come hai gia fatto tu e ti aggiorno
Apr 8, 2014 at 10:32 AM
Ciao, sei riuscito a fare qualcosa? ;-)
Coordinator
Apr 8, 2014 at 10:37 AM
Ciao!


Dunque ci sto lavorando su solo che sto periodo sto sotto consegna e quindi i lavori vanno un pelo a rilento rispetto al solito, conto di finirlo entro un paio di settimane comunque.

Tra parentesi e' una modifica che mi tornerebbe pure utile ora in un certo ambito lavorativo quindi devo pure sbrigarmi :)

Come ti trovi con la nuova versione di Luna?
Apr 8, 2014 at 2:36 PM
Edited Jun 3, 2014 at 4:03 PM
Anche a me tornerebbe utile proprio in questi giorni ;-) Per il momento sto usando la versione modificata di luna 3, ma sono in "ansia" di provare la versione 4 con le modifiche
Coordinator
Apr 26, 2014 at 9:11 AM
Ci sono quasi :D ho fatto una modifica un po piu radicale
May 5, 2014 at 8:10 AM
Ti sta dando del filo da torcere la modifica eh ;-)
non vedo l'ora di metterci le mani...
Coordinator
May 5, 2014 at 9:34 AM
Ciaooo scusa ci sto mettendo un po perche sto aggiungendo anche altre funzionalita :D che sono un po complesse ma necessarie.

Sto modificando i luna search parameter per cercare di creare la possibiita di fare join su altre tabelle in una query ... ma ci sono quasi. :)
May 5, 2014 at 12:31 PM
Immagino.
Sarebbe utile, anche, da ogni singolo campo poter restituire la relativa descrizione, ad esempio, in una ipotetica tabella clienti formata da codicecliente,ragionesociale,codicenazione poter ricavare la descrizione della nazione facendo classeclienti.codicenazione.getDescrizione(classenazioni) o una cosa simile, più che altro per velocizzare o facilitare l esplosione dei campi descrittivi. Non so se in futuro sara possibile, cmq appena hai finito le attuali modifiche provo a lavorarci su
Coordinator
May 5, 2014 at 1:02 PM
Guarda in realta se c'e' un collegamento diretto luna dovrebbe creare nell'esempio che hai inseirto tu dentro Cliente un oggetto readonly Nazione e fare da solo il caricamento in Lazy in modo che tu possa fare qualcosa del genere Cliente.Nazione.Descrizione.

Lui automaticamente in nazione ha creato un mgr di nazioni che va a fare la read usando il codicenazione come chiave. Non mi ricordo se l'ho disattivato o se funziona solo su access perche su sql server non l'avevo ancora implementato
May 5, 2014 at 1:44 PM
Edited Jun 3, 2014 at 4:03 PM
Perfetto, cmq appena pubblichi la nuova versione lo testerò sicuramente... Grazie mille
Coordinator
May 15, 2014 at 10:17 AM
Ho quasi finito la modifica, la sto testando. Solo che il fatto di fare una find per cercare la voce e vedere se c'e' o non c'e' non mi fa impazzire. Calcolando che e' una chiave primaria posso usare anche il metodo find e prender ela prima che di base dovrebbe anche essere l'unica... pero non sono molto convinto anche perche di base le chiavi stringa non mi fanno impazzire come metodologia di programmazione ehehhe
Jun 3, 2014 at 4:01 PM
Infatti...mi sta venendo un dubbio atroce, vengono gestiti anche gli indici univoci in sostituzione della chiave primaria?! cioè se una tabella non ha una chiave primaria ma un indice univoco questo viene recepito come chiave primaria? se "si", bisogna stare attenti a quel metodo "find" perchè c'è distinzione tra un record con indice null e un record con indice blank (quindi nell'eventuale where bisogna tenere il valore NULL e non "tradurlo" con blank), se "no" eventualmente bisogna pensare a come gestire le tabelle senza chiavi primarie ma con indici univoci (va contro ogni logica di programmazione lo so ;-) )
Jun 9, 2014 at 2:45 PM
Ciao Diego, scusa se continuo ma man mano che uso Luna mi vengono in mente delle "cosucce".
In un entity generator che avevo creato tempo fa, avevo aggiunto 2 funzioni per me basilari per l'utilizzo che facevo:
-classe2form: richiamandola in automatico prendeva i valori presenti nella classe e li "sbatteva" nel form (ovviamente dove nome proprieta = nome campo form)
-form2classe: richiamandola in automatico prendeva i valori del form e li "sbatteva" nella classe
Queste mi facevano risparmiare diverso tempo.
Appena pubblichi la nuova versione (con la gestione delle chiavi) implemento, per il mio utilizzo, anche queste 2 funzioni (magari anche estendendole, facendo un mapping preventivo, se il nome campo form non corrisponde al nome proprieta). Se posso essere di aiuto in qualche modo dimmi pure
Coordinator
Jun 9, 2014 at 3:20 PM
Grande!!!

In realta esiste un LunaPlugin, sviluppato da Camillo Martino che crea in automatico quello che dici tu, classe2form e form2classe, e per i progetti web crea anche il codice html dei controlli asp.net da incollare nella pagina con nomenclatura in standard di programmazione. Solo che non so dove e' finito perche ci stava lavorando su tempo fa.
Coordinator
Jun 9, 2014 at 3:24 PM
P.s. non so dove e' finito il plugin non lui ehhe
Coordinator
Jun 9, 2014 at 3:25 PM
Comunque ho apportato ancora altre modifiche all'engine di Luna solo che non riesco ancora a includere in maniera corretta questa modifica dellet abelle senza contatore, perche non riesco a trovar eun metodo che non sia un find a ogni salvataggio per vedere se devo andare in insert o in update e la cosa non mi piace. Sto cercando soluzioni alternative sia per performance che per garantire l'integrita dei dati
Jun 9, 2014 at 4:04 PM
partendo dal presupposto che (momentaneamente fino a nuovo metodo) bisogna lasciare il metodo find di certo per quanto riguarda le performance la select che richiama il find non deve avere tutti i campi in canna (che non servono a nulla e soprattutto occupano memoria), e supponendo che il find su campi chiave restituisca sempre 1 o 0 record la select dovrebbe avere un Top 1 (per essere sicuri). Non è proprio il massimo della vita certo, però dipende da come uno si crea le chiavi, uno deve proprio andarsela a cercare pero ;-), poi certi controlli si fanno prima di richiamare il "save" anche con una chiave identity, anzi soprattutto con una chiave identity.

PS.
non odiarmi, ci sarebbe un altra chicca, poter richiamare la descrizione del campo settata sulla tabella SQL, sarebbe utile per poter dare una tooltip in automatico quando si passa sopra a un campo, tipo Classe.getSQLDescription("NomeCampo"), cmq sono cose che cercherò di implementare io appena rilasci la nuova versione
Coordinator
Jun 9, 2014 at 4:08 PM
il metodo Find delle classi Dao gia fa una Top 1, pero tira giu tutti i campi eprche valorizza la classe entity relativa. Ma e' proprio il meccanismo in se che non mi piace e sto cercando di farmi venire una soluzione piu sofisticata.

La seconda cosa nel ps invece non l'ho capita benissimo
Jun 9, 2014 at 4:18 PM
Edited Jun 9, 2014 at 4:30 PM
ti linko un immagine che ho caricato per farti vedere
http://i62.tinypic.com/348t0ly.jpg

in pratica quel campo descrizione che si vede nell'immagine sarebbe perfetto poterlo richiamare per settare o delle tooltip o un testo descrittivo nella statusBar, poi questo lo farà l'utente, intanto poterlo solo richiamare con un metodo come questo ClasseTabella.GetDescription("Colonna1")
Coordinator
Jun 9, 2014 at 4:25 PM
A ok capito ma credo di poter fare di meglio. Se ci fai caso in ambiente di sviluppo mentre programmi se vai sopra una classe DAO o Entity quasliasi generata da Luna vedrai ceh ti appare un tooltip text. Posso fare la stessa cosa direttamente sulle singole property generate mettendo come tooltip text quello preso da li, e se non c'e' scrivere solo Property for Field xxx
Jun 9, 2014 at 4:30 PM
(ho editato poi ho visto che hai gia risposto e allora ho rieditato e rimesso qui)

Poi per il Find intendevo una roba del genere

if ClientiDAO.Find4operation(new lunasearchparameter("Codice",9082)) = 1 then
'metodo per update
else
'metodo per insert
end if

metodo Find4operation
fa una select solo per il primo campo oppure fa un count(*)
e restituisce 1 (o un enum giusto per essere fighi) per update e 0 per insert