Wie lösche ich mehrere DB -Entitäten mit Nhibernate?
-
18-09-2019 - |
Frage
Was ist die beste Praxis für dieses Problem? Gibt es integrierte Chargenfunktionen?
Beispielcode:
using (ITransaction transaction = _session.BeginTransaction())
{
_session.Delete("FROM myObject o WHERE o.Id = IN(1,2,...99999)");
transaction.Commit();
}
Danke im Voraus.
Lösung
HQL unterstützt die In -Klausel. Wenn Sie SetParameterList verwenden, können Sie sogar eine Sammlung übergeben.
var idList = new List<int>() { 5,3,6,7 };
_session.CreateQuery("DELETE MyDataClass o WHERE o.Id IN (:idList)")
.SetParameterList("idList", idList)
.ExecuteUpdate();
Beachten Sie, wie von Ddango in einem Kommentar erwähnt wird, dass die in Ihren Objekten angegebenen Beziehungskaskaden nicht ausgeführt werden, da das Ausführen einer HQL -Abfrage lediglich eine DB -Abfrage übersetzt und keine Entitätsobjekte geladen wird.
Andere Tipps
Ich hatte Probleme, die Antwort auf die Arbeit zu bekommen, und ich fand, dass die folgende Frage zu 100% funktioniert hat
Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
.SetParameterList("deleteIds", deleteIds)
.ExecuteUpdate();
Kunde ist der Klassenname, nicht der Tabellenname. ID ist Kleinbuchstaben und in HQL ist es der Hauptschlüssel, kein Eigenschaftsname in der Klasse (Eigenschaftsnamen werden unterstützt)
Sie können HQL verwenden, um mehrere Objekte zu löschen
Suchen Sie hier löschen - für Sitzung.Delete Beispiel
HQL -Beispiel -Beispiel (Sie können mit HQL verwenden):
ISession session = sessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();
String hqlDelete = "delete Customer c where c.name = :oldName";
// or String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = session.CreateQuery( hqlDelete )
.SetString( "oldName", oldName )
.ExecuteUpdate();
tx.Commit();
session.Close();