2017-07-17 1 views
0

Ist es möglich, eine Raw-SQL-Anweisung für Einfüge-/Aktualisierungsoperationen mit nHibernate zu generieren, ohne sie tatsächlich auszuführen? Angenommen natürlich, dass alles (Mappings, connectionStrings etc.) richtig konfiguriert ist?Wie nhibernate Raw sql für Insert/Update ohne Ausführung generieren?

Das nächste, was ich gefunden habe, ist zu nennen:

Session.SessionFactory.GetClassMetadata(typeof(Client)) 

, die ein Objekt vom Typ SingleTableEntityPersister kehrt enthält SQLIdentityInsertString, die wie folgt aussieht:

INSERT INTO Client (FirstName, LastName) values (?, ?) 

Aber es mich immer noch erfordern würde um alle Eigenschaften manuell zu binden, und obendrein ist SQLIdentityInsertString eine geschützte Eigenschaft. Gibt es dafür geeignete Möglichkeiten?

+0

Warum möchten Sie das tun? – mjwills

+0

Ich muss eine große Anzahl von Clients aus einer XML-Datei in die Datenbank importieren. Es gibt mehrere Abfragen, die ausgeführt werden müssen, aber wenn ich eine Roh-SQL für Einfüge-/Aktualisierungsoperationen hätte, könnte ich das mit nur einer Abfrage tun. Ich habe es bereits mit einer hardcoded SQL-Abfrage getestet, aber das ist natürlich nicht sehr wartbar (obwohl es eine signifikante Beschleunigung bereitgestellt hat). Ich möchte den Code in der Laufzeitumgebung generieren, indem ich die vorhandene nHibernate-Konfiguration und -Zuordnungen verwende und nicht manuell. –

+0

Ich denke, es gibt eine Methode auf einer Interceptor-Schnittstelle oder Basisklasse, die Ihnen die SQL-Zeichenfolge gibt, die verwendet wird: 'OnPrepareStatement()'. Sie könnten dies tun, aber ich denke, dass Sie zuerst die Arbeit simulieren und dann die Transaktion zurücksetzen müssen. –

Antwort

1

Okay, das nächste, was ich gefunden habe, ist eine eigene SQL-Abfrage mit einem String-Builder zu erstellen. Zuerst müssen Sie Ihre Klasse Metadaten extrahieren:

var metaData = Session.SessionFactory.GetClassMetadata(typeof(Client)) as SingleTableEntityPersister; 

Dann können Sie andere Informationen abrufen, wie zB:

var propertyNames = metaData.PropertyNames; 
var tableName = metaData.TableName; 
var firstPropertyValue = metaData.GetPropertyValue(client, propertyNames[0], EntityMode.Poco); 

Sobald Sie diese Informationen haben Sie Ihre eigene Abfrage manuell konstruieren können. Nicht genau die Lösung, die ich wollte, aber es ist so nah wie es geht, denke ich.

Es ist jedoch eine Sache zu beachten, dass die Session.CreateSQLQuery (string) -Methode derzeit abgehört wird, und die SetParameter-Methode daher nicht mit mehr als 10 benannten Parametern funktioniert. Es scheint bereits ein Fehlerbericht auf NHbiernate's Jira zu existieren.

+0

Vor nur fünf Stunden erstellt: [NH-4053] (https://nhibernate.jira.com/browse/NH-4053). –