Questione : Problema del nascondiglio di Nhibernate mentre usando gli inneschi di MS-SQL

Hey! il

I using Nhibernate con fluente, persistere una base di dati espressa del ms SQL 2008 in un commercio application.

I ha un codice categoria chiamato Receipt che contiene una lista con molti oggetti chiamati ReceiptItems. l'utente del
The può generare una ricevuta, aggiungere Receiptitems ad esso e pubblicarlo finchè la relativa non profonda parte di Finished.
This funziona bene e risparmia al db correttamente.
Now per il problema: il

I inoltre ha un innesco sulla ricevuta della tabella di sql, quella fuochi se inserito. Finished è prezzi di ampiezze di innesco di true.
The i nuovi “dalla tabella del fornitore„ ed aggiorna i prezzi per tutto il ReceiptItems, il
in il ReceiptItems table.

When che denomina il then
transaction del
and del
session.SaveorUpdate (value). Commettere () le cause degli ultimi del

the l'eccezione: il
StaleObjectStateException
Row era aggiornato o cancellato un'altra transazione (o tracciando di unsaved-valore era errato) in ReceiptItems



Removing il ofcourse di innesco ripara il problema, ma lo ho bisogno di aggiornare i prezzi. È ci del senso affinchè il nhibernate ignori il
error e rinfresca il relativo nascondiglio dopo i fuochi di innesco? definizioni di esempio del codice categoria del




straightforward con i rilievi fluenti: class= " lineNumbers " >
1 del >

 ricevuta pubblica del codice categoria
    {

        ricevuta pubblica () {}
        /// Identificator///
        identificazione virtuale pubblica di int {ottenere; insieme riservato; }
         di /// se allineare finished, cant pubblicano i dati 
        booleano virtuale pubblico rifinito {ottenere; insieme; }
        Items di /// di questa ricevuta 
        articoli virtuali pubblici di IList {ottenere; insieme; }
    }

    /// che Mapping per NHibernate  fluente
    codice categoria pubblico ProdajaMap: ClassMap
    {
       
        ReceiptMap pubblico ()
        {
            Tabella (“ricevuta„);
            OptimisticLock.All ();
            DynamicUpdate ();
            Identificazione (=> x.Id di x);
            Programma (=> x.Finished di x);
            HasMany (=> x.Items) .AsBag () .KeyColumn (“Receipt_ID„ di x);
        }
    } class= libero " lineNumbers " >
1 del >


codice categoria pubblico ReceiptItem
    {

        ReceiptItem pubblico () {}

        identificazione virtuale pubblica di int {ottenere; insieme riservato; }
        Id di /// della ricevuta 
        int virtuale pubblico Receipt_ID {ottenere; insieme; }

        prezzo più Supplier  di ///
        prezzo decimale virtuale pubblico {ottenere; insieme; }
        sconto più Supplier  di ///
        sconto decimale virtuale pubblico {ottenere; insieme; }
    }

    /// che Mapping per NHibernate  fluente
    codice categoria pubblico ReceiptItemMap: ClassMap
    {
        ReceiptItemMap pubblico ()
        {
            Tabella (“ReceiptItems„);
            OptimisticLock.All ();
            DynamicUpdate ();
            Identificazione (=> x.Id di x);
            Programma (=> x.Receipt_ID di x). Colonna (“Receipt_ID„);
            Programma (=> x.Price di x);
            Programma (=> x.Discount di x);

        }
    } class= >



Thanks di


class= del

Risposta : Problema del nascondiglio di Nhibernate mentre usando gli inneschi di MS-SQL

Non tenterei di unire entrambi gli inneschi e l'uso di uno strato di dati quale nhibernate - state andando sempre ottenere i problemi di sincronizzazione. il nHibernate è inteso per dirigere i vostri dati - ed il vostro strato di affari dovrebbe dirigere i processi come aggiornamento dei vostri prezzi. Personalmente non vado vicino agli inneschi per alcuna logica di affari - per la verifica forse, ma a nient'altro. Penso che oscurino la logica di affari e la rendano nigh su impossible realizzare altre soluzioni di codice per il controllo dei dati - come state trovando.
Perché non entrare il vostro codice di innesco in una procedura immagazzinata e denominare la procedura dall'interno della portata di transazione dell'aggiornamento se “rifinisse„ la bandierina è allineare? Dirigerei questo all'interno dello strato di affari, ma potreste spostare questo verso lo strato di dati se desiderate.

Tim
Altre soluzioni  

 
programming4us programming4us