C# 2.0
In alcune applicazioni c’è la necessità di gestire un corretto accesso ai dati, evitando eventuali problemi di concorrenza. Tipico esempio potrebbe essere quello delle gestione degli ordini, dove due utenti stanno lavorando contemporaneamente sullo stesso ordine e non si vuole rischiare di sovrascrivere informazioni dell’uno o dell’altro operatore.
Con NHibernate quindi è abbastanza semplice gestire tale esigenza, agendo nel seguente modo:
1. Aggiungere nella tabella degli ordini il campo DataUpdate di tipo datetime.
2. Modificare il file di mapping della tabella interessata, aggiungendo l’elemento timestamp subito dopo quello dell’identificativo della tabella, ed è importante che sia in questa posizione, prima della definizione delle altre proprietà affinché tutto funzioni correttamente.
…
<id name="Id" type="Guid">
<column name="Id" length="16" sql-type="uniqueidentifier" not-null="true" unique="true" index="PK_Ordine"/>
<generator class="guid" />
</id>
<timestamp column ="DataUpdate" name ="DataUpdate"/>
<property name="IdAssegnazione" type="Guid">
<column name="IdAssegnazione" length="16" sql-type="uniqueidentifier" not-null="false"/>
</property>
…
3. Gestire l’eccezione di tipo StaleObjectStateException nel metodo di aggiornamento dei dati.
try
{
using (ISession s = SessionController.Instance.NHSession)
{
s.SaveOrUpdate(ordine);
s.Flush();
}
}
}
}
catch (NHibernate.StaleObjectStateException ex)
{
MessageBox.Show("Attenzione! L’ordine è già stato modificato da un altro utente.\rControllare il file di Log. ", "Gestione Ordini", MessageBoxButtons.OK, MessageBoxIcon.Warning);
// Eventuale scrittura su file di log
…
}
catch (Exception ex)
{
…
}
finally
{
…
}
During my day to day work, I frequently find useful information, from various blogs spread all over the Internet. In order to avoid others repeating my same researches, I decided to share my findings in this blog, with no claiming to be exhaustive nor teaching anything to anyone. These postings are provided 'AS IS' with no warranties, and confer no rights. The views expressed on this weblog are mine alone.
Visualizzazione post con etichetta NHibernate. Mostra tutti i post
Visualizzazione post con etichetta NHibernate. Mostra tutti i post
mercoledì 25 agosto 2010
NHibernate - Gestione della concorrenza
martedì 24 agosto 2010
NHibernate - a different object with the same identifier value was already associated with ...
C# 2.0
Questo messaggio d’errore è molto probabilmente dovuto ad un errore di mappatura, specialmente nella cancellazione a cascata: cascade="all-delete-orphan", nel senso che questo attributo non dovrebbe essere presente.
Questo messaggio d’errore è molto probabilmente dovuto ad un errore di mappatura, specialmente nella cancellazione a cascata: cascade="all-delete-orphan", nel senso che questo attributo non dovrebbe essere presente.
NHibernate - Combo SelectedItem binding
C# 2.0
Non sempre assegnando direttamente un oggetto alla proprietà binding SelectedItem di un combo, questo viene sincronizzato correttamente: per ovviare a questo inconveniente bisogna esporre l’Id dell’oggetto e valorizzare la proprietà SelectedValue del combo a questo Id.
Inoltre se in un combo, il binding impostato su SelectedItem sembri non sentire il change della base dati agganciata, verificare che la tabella di riferimento nel file di mapping abbia impostato il lazy a false:
<many-to-one name="TipoNota" lazy ="false" class="Pratiche.DataLayer.Database.Entities.TipoNota, Pratiche.DataLayer">
<column name="TipoNotaId" length="4" sql-type="int" not-null="false"/>
</many-to-one>
Non sempre assegnando direttamente un oggetto alla proprietà binding SelectedItem di un combo, questo viene sincronizzato correttamente: per ovviare a questo inconveniente bisogna esporre l’Id dell’oggetto e valorizzare la proprietà SelectedValue del combo a questo Id.
Inoltre se in un combo, il binding impostato su SelectedItem sembri non sentire il change della base dati agganciata, verificare che la tabella di riferimento nel file di mapping abbia impostato il lazy a false:
<many-to-one name="TipoNota" lazy ="false" class="Pratiche.DataLayer.Database.Entities.TipoNota, Pratiche.DataLayer">
<column name="TipoNotaId" length="4" sql-type="int" not-null="false"/>
</many-to-one>
NHibernate - Oggetti su istanze diverse
C# 2.0
A volte gli oggetti appartengono ad istanze diverse, e pur essendo dello stesso tipo possono risultare diversi, per questo quindi occorre fare l’override dell’oggetto in questione:
public override bool Equals(object obj)
{
if (obj != null && obj.ToString() != string.Empty)
{
return _id == ((TipoNota)obj).Id;
}
else
{
return base.Equals(obj);
}
}
A volte gli oggetti appartengono ad istanze diverse, e pur essendo dello stesso tipo possono risultare diversi, per questo quindi occorre fare l’override dell’oggetto in questione:
public override bool Equals(object obj)
{
if (obj != null && obj.ToString() != string.Empty)
{
return _id == ((TipoNota)obj).Id;
}
else
{
return base.Equals(obj);
}
}
NHibernate - Collezioni di tipo Bag e Set
C# 2.0
Le collezioni di tipo Bag permettono l’inserimento di valori duplicati, questo quindi può comportare dei problemi in fase di Refresh, in pratica vengono duplicati i valori all’interno della collection. A questo punto è consigliabile una collezione di tipo Set, la quale può anche essere ordinata:
<set name="PraNoteScadenzes" order-by="DataScadenza desc" lazy ="false" inverse ="true" cascade ="all-delete-orphan">
<key column="PraId"/>
<one-to-many class="Pratiche.DataLayer.Database.Entities.NoteScadenze, Pratiche.DataLayer"/>
</set>
Nella classe poi, la proprietà deve essere codificata così:
public virtual Iesi.Collections.ISet PraNoteScadenzes
{
get
{
if (_praNoteScadenzes == null)
{
_praNoteScadenzes = new SortedSet();
}
return _praNoteScadenzes;
}
set { _praNoteScadenzes = value; }
}
Le collezioni di tipo Bag permettono l’inserimento di valori duplicati, questo quindi può comportare dei problemi in fase di Refresh, in pratica vengono duplicati i valori all’interno della collection. A questo punto è consigliabile una collezione di tipo Set, la quale può anche essere ordinata:
<set name="PraNoteScadenzes" order-by="DataScadenza desc" lazy ="false" inverse ="true" cascade ="all-delete-orphan">
<key column="PraId"/>
<one-to-many class="Pratiche.DataLayer.Database.Entities.NoteScadenze, Pratiche.DataLayer"/>
</set>
Nella classe poi, la proprietà deve essere codificata così:
public virtual Iesi.Collections.ISet PraNoteScadenzes
{
get
{
if (_praNoteScadenzes == null)
{
_praNoteScadenzes = new SortedSet();
}
return _praNoteScadenzes;
}
set { _praNoteScadenzes = value; }
}
NHibernate - "Unexpected row count: 0; expected: 1"
C# 2.0
Con questo errore verificare nel file di mapping che:
1. L’attributo “class” dell’elemento “generator”, nel caso di Guid deve essere <generator class="guid" />
2. Togliere anche l’attributo unsaved-value="null".
Inoltre togliere l’eventuale default nel campo chiave del DB SQL.
Con questo errore verificare nel file di mapping che:
1. L’attributo “class” dell’elemento “generator”, nel caso di Guid deve essere <generator class="guid" />
2. Togliere anche l’attributo unsaved-value="null".
Inoltre togliere l’eventuale default nel campo chiave del DB SQL.
Iscriviti a:
Post (Atom)