Frage : Nhibernate Pufferspeicherproblem bei der Anwendung von MS-SQL Auslösern

He!

I morgens using Nhibernate mit fließendem, eine Eildatenbank Mitgliedstaat-SQL 2008 auf einem Geschäft application.

I fortzubestehen haben eine Kategorie, die Receipt genannt wird, der eine Liste mit vielen Gegenständen enthält, die ReceiptItems genannt werden.
The Benutzer kann einen Empfang verursachen, Receiptitems ihm hinzufügen, und es redigieren, solange sein nicht markiertes Finished.
This Teil gut funktioniert und zum DB richtig speichert.
Now für das Problem:

I haben auch einen Auslöser auf dem sql-Tabelle Empfang, der Feuer wenn eingesetzt. Ist neue Preise der true.
The Triggerreichweiten von der „Lieferantentabelle“ fertig und aktualisiert die Preise für alles ReceiptItems,
in das ReceiptItems table.

When
session.SaveorUpdate (value)
and then
transaction benennend. ()

the festlegen letzterursachen die Ausnahme:
StaleObjectStateException
Row war modernisiert, oder gelöscht, indem eine andere Verhandlung (oder das Unsavedwert Diagramm war falsch), in ReceiptItems



Removing, regelt das Triggerofcourse das Problem, aber ich benötige es, die Preise zu aktualisieren. Gibt es irgendeine Weise, damit nhibernate das
error ignoriert und erneuert seinen Pufferspeicher nach den Triggerfeuern?




straightforward Kategorien-Beispieldefinitionen mit fließenden Kartenaufnahmen:

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
 allgemeiner Kategorie Empfang
    {

        allgemeiner Empfang () {}
        /// Identificator///
        allgemeine virtuelle int Identifikation {erhalten; privater Satz; }
        /// , wenn fertige zutreffende, Neigung Daten  redigieren
        allgemeines virtuelles Boolesches beendet {erhalten; Satz; }
        /// Items dieses Empfangs 
        allgemeine virtuelle IList Einzelteile {erhalten; Satz; }
    }

    ///, das für NHibernate fließendes  Mapping ist
    allgemeine Kategorie ProdajaMap: ClassMap
    {
       
        allgemeines ReceiptMap ()
        {
            Tabelle („Empfang“);
            OptimisticLock.All ();
            DynamicUpdate ();
            Identifikation (x => x.Id);
            Diagramm (x => x.Finished);
            HasMany (x => x.Items) .AsBag () .KeyColumn („Receipt_ID“);
        }
    } 


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
allgemeine Kategorie ReceiptItem
    {

        allgemeines ReceiptItem () {}

        allgemeine virtuelle int Identifikation {erhalten; privater Satz; }
        /// Id des Empfangs 
        allgemeiner virtueller int Receipt_ID {erhalten; Satz; }

        ///-Supplier Preis 
        allgemeiner virtueller dezimaler Preis {erhalten; Satz; }
        ///-Supplier Diskont 
        allgemeiner virtueller dezimaler Diskont {erhalten; Satz; }
    }

    ///, das für NHibernate fließendes  Mapping ist
    allgemeine Kategorie ReceiptItemMap: ClassMap
    {
        allgemeines ReceiptItemMap ()
        {
            Tabelle („ReceiptItems“);
            OptimisticLock.All ();
            DynamicUpdate ();
            Identifikation (x => x.Id);
            Diagramm (x => x.Receipt_ID). Spalte („Receipt_ID“);
            Diagramm (x => x.Price);
            Diagramm (x => x.Discount);

        }
    } 



Thanks!


Antwort : Nhibernate Pufferspeicherproblem bei der Anwendung von MS-SQL Auslösern

Ich versuchen nicht, beide Auslöser und den Gebrauch von einer Datenschicht wie nhibernate zu kombinieren - Sie werden immer Synchrounisierungsprobleme erhalten. nHibernate soll Ihre Daten handhaben - und Ihre Geschäftsschicht sollte Prozesse wie Aktualisierung Ihrer Preise handhaben. Persönlich ich gehe nicht nahe Auslösern für irgendeine Geschäftslogik - für möglicherweise revidieren, aber nichts anderes. Ich denke, dass sie Geschäftslogik undeutlich machen und sie nah auf unmöglichem, andere Codelösungen für die Leitung der Daten einzuführen bilden - wie Sie finden.
Warum nicht Ihren Triggercode in ein gespeichertes Verfahren verschieben und das Verfahren innerhalb vom Verhandlungbereich des Updates benennen, wenn Markierungsfahne ist zutreffend „beendete“? Ich handhaben dieses innerhalb der Geschäftsschicht, aber Sie konnten dieses auf die Datenschicht verschieben, wenn Sie wünschen.

Tim
Weitere Lösungen  
 
programming4us programming4us