J'utilise NHibernat en combinaison avec l'héritage. Cela signifie que j'ai un objet parent et un objet enfant qui héritent l'un de l'autre, mais que chacun a son propre fichier de mappage, donc des tables séparées sont créées.Utiliser .Any() en combinaison avec NHibernate et l'héritage
J'avais des problèmes avec la fonctionnalité .Tout() quand je fais ce qui suit:
var value = session.Query<ParentObject>().Any(t => t.Name.Equals(name));
J'ai débogage du code source NHibernate et j'ai découvert que lorsqu'une requête i effectuée sur un objet , il boucle aussi à travers toutes les autres classes qui en héritent. Cela signifie que pour un appel de fonction .Any, un ensemble de résultats de booléens est rempli. Mais la chose étrange est que dans DefaultQueryProvider.cs (ligne 125) ce qui suit arrive: retourner les résultats [0];
Le premier résultat est le résultat .Any de mon objet ChildObject, donc le résultat de mon objet parent est complètement ignoré.
J'ai fait une UnitTest pour prouver ce comportement:
[TestMethod]
public void TestInheritance()
{
var name = "test";
var sessionFactory = CreateSessionFactory(database2);
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
var testObject = new ParentObject();
testObject.SetName(name);
session.SaveOrUpdate(testObject);
transaction.Commit();
var value = session.Query<ParentObject>().Any(t => t.Name.Equals(name));
Assert.IsTrue(value);
}
}
Vous ne penseriez pas, mais cela échoue test unitaire. Si je teste le même code avec une classe dont aucune autre classe n'en hérite, le test unitaire est réussi.
Je peux faire une solution de contournement pour cela en utilisant:
var value = session.Query<ParentObject>().FirstOrDefault(t => t.Name.Equals(name)) != null
mais je veux juste utiliser la fonctionnalité Tout().
Est-ce que quelqu'un a peut-être une solution pour cela?
ajouté également dans le Bug Tracker NHibernate: https://nhibernate.jira.com/browse/NH-3939
Idéal pour résoudre votre cas. Maintenant, pour ceux qui ont besoin du polymorphisme, ils ont besoin d'une correction de bogue dans NHibernate, je pense. –