Articoli con tag NHibernate

Esportare schema del db da NHibernate – NHibernate SchemaExport

Nota: Articoli etichettati come Snippet non contengono codice completo ma solo parti di esso, recuperate da appunti. Per cui, potrebbe essere necessario modificarne alcuni nomi o indici. Per ogni chiarimento, lasciate un commento all’articolo.

Dopo aver configurato correttamente NHibernate con tutti i file di mapping ed aver definito correttamente i parametri di connessione, è possibile lasciare al framework l’onere di costruire il database.

Un vincolo importante (nel caso decidiate di eseguire l’export) è che il database (vuoto) esista sul DBMS e che l’utente sia autorizzato alla creazione di tabelle e vincoli.

A mio parere questa funzionalità andrebbe utilizzata solo come metodo di verifica della correttezza del mapping (ad esempio facendo creare un db parallelo per i confronti) e non per una generazione da “produzione”, almeno se non seguita da un profondo controllo manuale…

private static string mappingFilePath = “Mapping\\hibernate.cfg.xml”;

NHibernate.Tool.hbm2ddl.SchemaExport se = new NHibernate.Tool.hbm2ddl.SchemaExport(new NHibernate.Cfg.Configuration().Configure(mappingFilePath));

se.Create(true, false);

Ho inserito il percorso completo dei Namespace, ovviamente è possibile utilizzare normalmente la direttiva “using”.
I due parametri del metodo .Create indicano se si desidera generare lo scritpt in console e se si desidera esportare il mapping sul db (creare fisicamente le tabelle & co…)

Per info più approfondite, il link di riferimento (su Hibernate) è:
http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/tool/hbm2ddl/SchemaExport.html

Annunci

, ,

Lascia un commento

NHibernate, utilizzo di liste comma separated per clausola WHERE IN – setParameter

Nota: Articoli etichettati come Snippet non contengono codice completo ma solo parti di esso, recuperate da appunti. Per cui, potrebbe essere necessario modificarne alcuni nomi o indici. Per ogni chiarimento, lasciate un commento all’articolo.

Se vi è la necessità di utilizzare, all’interno di una query HQL (Hibernate Query Language), la clausola “WHERE qualcosa IN”, Nhibernate fornisce la possibilità di utilizzare (anche per questo caso) le query parametriche, ovvero di evitare la creazione di query mediante concatenazione del testo.

Esempio:/* Lista di id: 3, 5, 9 */

— Concatenazione — Metodo poco elegante e poco “object oriented”

string listaId = “3, 5, 9”;  // Stringa creata mediante funzioni di concatenazione, es: string.join(…)
string myQuery = “UPDATE Assegnazione a SET a.qtaRendere = null WHERE a.id IN (” + listaId + “)”;

— Query parametrica — Bel metodo!

ArrayList listaIdAssegnazioni = new ArrayList();
listaIdAssegnazioni.Add((int)mle.idAssegnazione);  //Ripetuta per ogni id!

string myQuery = “UPDATE Assegnazione a SET a.qtaRendere = null WHERE a.id IN (:elencoId)”;
var qry = [ISession].CreateQuery(myQuery);  //con [ISession] si intende l’oggetto di tipo ISession già creato precedentemente
qry.SetParameterList(“elencoId”, listaIdAssegnazioni.ToArray(typeof(int)));
qry.ExecuteUpdate();

 

, ,

Lascia un commento

Utilizzare un Enum come DataSource per una ComboBox – Enums as DataSource

Eccomi ancora una volta a riportare sul blog la soluzione di un problemino di programmazione che mi ha appena fatto perdere un paio d’ore…

Preciso subito quali sono le fonti; il codice è stato preso e riadattato da due siti web, i quali trattavano l’argomento ma con delle piccole differenze rispetto a quanto servisse a me, e da un riferimento a msdn Microsoft.

http://stackoverflow.com/questions/1177915/binding-a-datasource-with-some-enum-values
http://developcode.blogspot.com/2006/12/dropdownlists-with-enums-as-datasource.html
http://msdn.microsoft.com/it-it/library/5tbh8a42%28v=VS.90%29.aspx

Il problema è il seguente: utilizzare un Enum in C# per popolare una ComboBox, visualizzando gli alias testuali ma utilizzando i valori numerici sottostanti per eseguire l’associazione manuale con un oggetto, da persistere mediante NHibernate.

L’oggetto in gestione è “Utente”, che ha diversi permessi per l’accesso all’applicazione. Di seguito la definizione dell’Enum:

public enum LivelloAccesso { Magazzino = 1, Ufficio = 2, Amministratore = 3};

Notare che ho esplicitato il valore delle costanti in Enum, al fine di essere sicuro di quali valori NH avrebbe poi salvato sul database.

Per completezza, nel mapping di NH ho indicato la proprietà come Int32

<property name=”livelloAccesso” column=”livelloAccesso” type=”Int32″ />

mentre nel codice

public virtual LivelloAccesso livelloAccesso { get; set; }

in modo che NH fosse in grado di effettuare automaticamente il mapping tra valori enum e gli Int32 associati.

Tornando all’argomento principale, questo è il codice utilizzato per mappare l’enum LivelloAccesso su una ComboBox in grafica:

List<KeyValuePair<int, string>> listaLivelliAccesso = new List<KeyValuePair<int, string>>();
foreach (Enum enumValue in Enum.GetValues(typeof(LivelloAccesso)))
{
listaLivelliAccesso.Add(new KeyValuePair<int, string>(Convert.ToInt16(enumValue),
enumValue.ToString()));
}
cmbLivelloAccesso.DataSource = listaLivelliAccesso;
cmbLivelloAccesso.DisplayMember = “Value”;
cmbLivelloAccesso.ValueMember = “Key”;

Questo il risultato grafico:

Da notare che non ho usato il termine Binding perchè l’associazione tra la combo e la proprietà dell’oggetto viene effettuata “a mano” mediante il seguente codice:

cmbLivelloAccesso.SelectedValue = Convert.ToInt32(i_utente.livelloAccesso);

Ovviamente conversione inversa dovrà essere fatta in fase di salvataggio dell’oggetto. Al momento non ho ancora completato il codice, per cui non riporto tale conversione, rimandando la sua scrittura su un eventuale commento successivo.

Una evoluzione potrebbe essere quella di eseguire il vero e proprio Binding tra la combo e l’oggetto… Chi mi aiuta? 😉

,

Lascia un commento