Comment est-ce que je supprime un objet sans le récupérer d'abord de la DB?Comment supprimer un objet en utilisant PK dans nhibernate?
Dans un autre ORM, je peux le faire:
session.Delete<User>(1); // 1 = PK
Comment est-ce que je supprime un objet sans le récupérer d'abord de la DB?Comment supprimer un objet en utilisant PK dans nhibernate?
Dans un autre ORM, je peux le faire:
session.Delete<User>(1); // 1 = PK
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)
.
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.
Vous pouvez le faire
User user = new User();
user.Id = 1;
session.Delete(user);
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.
Je crains qu'il ne charger. –
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. –
La "charge" ne chargera pas l'utilisateur comme vous l'avez dit. Mais la suppression sera, toujours. – Junior
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
Peut-être vrai en 2010 mais de nos jours il y a plus et de meilleures options aussi –
@LuisFilipe: Et ce sont ...? ? –
Est-ce que cela fonctionnera également si le nom de ma colonne de clé primaire est différent de "id"? –
@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. –
Pourquoi ne pas simplement 'session.Delete (session.Query() .FirstOrDefault (c => c.Id == id));'? –