2010-06-17 5 views

Répondre

25

Ajoutez la classe suivante à votre projet:

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(); 
    } 
} 

Vous pouvez maintenant utiliser session.Delete<User>(1).

+1

Est-ce que cela fonctionnera également si le nom de ma colonne de clé primaire est différent de "id"? –

+0

@A_J Oui. 'id' est un nom spécial qui représente l'identifiant de l'entité. Voir http://nhibernate.info/doc/nhibernate-reference/queryhql.html#queryhql-where. –

+0

Pourquoi ne pas simplement 'session.Delete (session.Query () .FirstOrDefault (c => c.Id == id));'? –

2

Vérifiez la méthode ExecuteUpdate sur l'objet IQuery.

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

Doit supprimer l'objet sans le récupérer afaik.

6

Vous pouvez le faire

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

Essayez ceci:

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

Load va créer un proxy pour l'objet utilisateur avec l'ensemble d'identifiant. Je ne suis pas sûr si Delete va charger l'objet de la base de données avant de le supprimer et je suis incapable de le tester pour le moment.

+1

Je crains qu'il ne charger. –

+0

Charger n'est pas! La charge crée juste un proxy pour l'objet réel. C'est juste une boîte avec un identifiant. Obtenir charge réellement l'enregistrement de la base de données. Donc, non, il ne charge "réellement" rien à partir de la base de données, tant que vous ne lisez que la propriété id. –

+0

La "charge" ne chargera pas l'utilisateur comme vous l'avez dit. Mais la suppression sera, toujours. – Junior

0

avant le ver 2 il n'y avait pas un moyen. Après ver 2 vous avez la méthode ExecuteUpdate() sur IQuery et il y a une méthode surchargée sur ISession.Delete() où il accepte une chaîne qui définit une requête de suppression

+0

Peut-être vrai en 2010 mais de nos jours il y a plus et de meilleures options aussi –

+0

@LuisFilipe: Et ce sont ...? ? –

Questions connexes