Comment peut-on supprimer une entité ayant NHibernate seulement son identifiant et tapez?

StackOverflow https://stackoverflow.com/questions/1323427

  •  19-09-2019
  •  | 
  •  

Question

Je me demande comment peut-on supprimer une entité ayant juste son ID et le type (comme dans la cartographie) en utilisant NHibernate 2.1?

Était-ce utile?

La solution

Si vous utilisez le chargement paresseux, la charge ne crée que proxy.

session.Delete(session.Load(type, id));

Avec NH 2.1, vous pouvez utiliser HQL. Je ne sais pas à quoi il ressemble réellement, mais quelque chose comme ceci: Notez que ceci est sujet à l'injection SQL - si possible, utiliser paramétrées requêtes au lieu avec SetParameter ()

session.Delete(string.Format("from {0} where id = {1}", type, id));

Modifier

Pour la charge, vous n'avez pas besoin de connaître le nom de la colonne Id.

Si vous avez besoin de le savoir, vous pouvez l'obtenir par les métadonnées NH:

sessionFactory.GetClassMetadata(type).IdentifierPropertyName

Une autre édition.

session.Delete() est instancié l'entité

Lors de l'utilisation Session.delete (), NH charge l'entité de toute façon. Au début, je ne l'aimais pas. Puis j'ai réalisé les avantages. Si l'entité fait partie d'une structure complexe en utilisant l'héritage, les collections ou « tout » -références, il est en fait plus efficace.

Par exemple, si les deux A de classe et B héritent de Base, il ne cherche pas à supprimer des données dans le tableau B lorsque l'entité réelle est de type A. Ce ne serait pas possible sans charger l'objet réel. Ceci est particulièrement important quand il existe de nombreux types hérités qui se composent également de nombreuses tables supplémentaires chacun.

La même situation est donnée lorsque vous avez une collection de Bases, qui se trouvent être toutes les instances de A. Lors du chargement de la collection en mémoire, NH sait qu'il n'a pas besoin d'enlever B-stuff.

Si la A entité a une collection de Bs, qui contient Cs (et ainsi de suite), il ne cherche pas à supprimer les Cs lorsque la collection de Bs est vide. Ceci est seulement possible lors de la lecture de la collection. Ceci est particulièrement important lorsque C est complexe propre, regroupant plus de tables, et ainsi de suite.

Plus la structure est complexe et dynamique, plus efficace est à charger les données réelles au lieu de « aveuglément » le supprimer.

HQL Supprime ont des pièges

HQL supprime pas pour charger des données dans la mémoire. Mais HQL supprime ne sont pas si intelligents. Ils traduisent essentiellement le nom de l'entité au nom de la table correspondante et retirez que la base de données. En outre, il supprime certaines données de collecte agrégées.

Dans les structures simples, cela peut bien fonctionner et efficace. Dans les structures complexes, pas tout est supprimé, ce qui conduit à la contrainte des violations ou « fuites de mémoire de base de données ».

Conclusion

I essayé aussi d'optimiser la suppression de NH. J'ai donné dans la plupart des cas, parce que NH est encore plus intelligent, il « fonctionne » et est généralement assez rapide. L'un des algorithmes de suppression les plus complexes que j'ai écrit est d'analyser les définitions de mappage NH et la construction de supprimer des déclarations de cela. Et - sans surprise - il est impossible sans la lecture des données de la base de données avant la suppression. (Je viens réduit à ne charger que les clés primaires.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top