Come si elimina un oggetto senza prima recuperarlo dal db?Come eliminare un oggetto usando PK in Nhibere?
In un altro ORM, posso fare questo:
session.Delete<User>(1); // 1 = PK
Come si elimina un oggetto senza prima recuperarlo dal db?Come eliminare un oggetto usando PK in Nhibere?
In un altro ORM, posso fare questo:
session.Delete<User>(1); // 1 = PK
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)
.
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.
Si potrebbe fare questo
User user = new User();
user.Id = 1;
session.Delete(user);
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.
ho paura che fa caricarlo. –
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. –
Il "caricamento" non caricherà l'utente come hai detto tu. Ma l'eliminazione sarà, sempre. – Junior
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
Forse vero nel 2010 ma al giorno d'oggi ci sono opzioni più e migliori pure –
@LuisFilipe: E quelli sono ...? ? –
Funzionerà anche se il nome della colonna della mia chiave primaria è diverso da "id"? –
@A_J Sì. 'id' è un nome speciale che rappresenta l'id dell'entità. Vedi http://nhibernate.info/doc/nhibernate-reference/queryhql.html#queryhql-where. –
Perché non solo 'session.Delete (session.Query() .FirstOrDefault (c => c.Id == id));'? –