2010-06-17 10 views

risposta

25

Aggiungere la seguente classe al progetto:

public static class SessionHelper 
{ 
    public static void Delete<TEntity>(this ISession session, object id) 
    { 
     var queryString = string.Format("delete {0} where id = :id", 
             typeof(TEntity)); 
     session.CreateQuery(queryString) 
       .SetParameter("id", id) 
       .ExecuteUpdate(); 
    } 
} 

È ora possibile utilizzare session.Delete<User>(1).

+1

Funzionerà anche se il nome della colonna della mia chiave primaria è diverso da "id"? –

+0

@A_J Sì. 'id' è un nome speciale che rappresenta l'id dell'entità. Vedi http://nhibernate.info/doc/nhibernate-reference/queryhql.html#queryhql-where. –

+0

Perché non solo 'session.Delete (session.Query () .FirstOrDefault (c => c.Id == id));'? –

2

Partenza il metodo ExecuteUpdate sull'oggetto IQuery.

IQuery q = session.CreateQuery ("delete from User where Id = 1"); 
q.ExecuteUpdate(); 

necessario eliminare l'oggetto senza recuperarlo afaik.

6

Si potrebbe fare questo

User user = new User(); 
user.Id = 1; 
session.Delete(user); 
3

Prova questo:

var user = session.Load<User>(1); 
session.Delete(user); 

Load sarà creare un proxy per l'oggetto d'uso con il set identifier. Non sono sicuro che se lo Delete caricherà l'oggetto dal database prima di eliminarlo e non riesco a testarlo al momento.

+1

ho paura che fa caricarlo. –

+0

Il carico non è Get! Carica crea solo un Proxy per l'oggetto reale. È solo una scatola con un ID. Ottieni effettivamente carica il record dal database. Quindi, no, non "in realtà" carica nulla dal db, a patto di leggere solo la proprietà id. –

+0

Il "caricamento" non caricherà l'utente come hai detto tu. Ma l'eliminazione sarà, sempre. – Junior

0

prima della ver 2 non c'era un modo. Dopo ver 2 hai il metodo ExecuteUpdate() su IQuery e non v'è un metodo di overload su ISession.Delete() dove si accetta una stringa che definisce una query delezione

+0

Forse vero nel 2010 ma al giorno d'oggi ci sono opzioni più e migliori pure –

+0

@LuisFilipe: E quelli sono ...? ? –

Problemi correlati