Come eliminare più entità db con NHibernate?
-
18-09-2019 - |
Domanda
Qual è la migliore pratica per questo problema? C'è qualche funzionalità dosaggio built-in?
Codice di esempio:
using (ITransaction transaction = _session.BeginTransaction())
{
_session.Delete("FROM myObject o WHERE o.Id = IN(1,2,...99999)");
transaction.Commit();
}
Grazie in anticipo.
Soluzione
HQL supporta la clausola IN, e se si utilizza setParameterList si può anche passare in una collezione.
var idList = new List<int>() { 5,3,6,7 };
_session.CreateQuery("DELETE MyDataClass o WHERE o.Id IN (:idList)")
.SetParameterList("idList", idList)
.ExecuteUpdate();
Essere consapevoli, come citato da ddango in un commento, che cascate di relazione di cui gli oggetti non saranno eseguiti dal momento che esegue una query HQL si traduce semplicemente a una query DB e non realmente caricare eventuali oggetti entità.
Altri suggerimenti
ho avuto problemi nel trovare la risposta al lavoro e ho trovato la seguente query ha funzionato al 100%
Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
.SetParameterList("deleteIds", deleteIds)
.ExecuteUpdate();
Il cliente è il nome della classe non è il nome della tabella. id è minuscolo e in HQL è la chiave primaria non è un nome di proprietà della classe (I nomi delle proprietà sono supportati)
Potete utilizzare HQL per eliminare più oggetti
Cercare delete qui - per Session.delete esempio
HQL DELETE esempio (è possibile utilizzare in con HQL):
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();