2008-11-16 5 views
1

J'ai utilisé NHibernate 2.0.1.4000 sur tous les projets .NET 3.5 SP1 actuels et n'ai eu aucun problème avec d'autres requêtes (utilisant les API Query ou Criteria), jusqu'à ce que de nouvelles affaires la logique a dicté la nécessité d'une nouvelle requête dans ce projet particulier par rapport à la base de données de l'application qui doit extraire des enregistrements avec une propriété null spécifique (de type DateTime) à partir d'une seule table. Sachant que vous ne pouvez pas utiliser la restriction non-égale pour ce type de requête, mais que vous pouvez utiliser la restriction IsNull, cette requête simple génère une "valeur ne peut pas être nulle!" Exception lors de l'exécution J'ai des fichiers journaux log4net de mode DEBUG étendus, que j'ai examinés et que je n'ai pas encore aidé, et j'ai vérifié que ma classe pour la table spécifie la propriété que je vérifie est une propriété nullable (DateTime?) Pour éviter le problèmes qui peuvent provoquer en forçant des mises à jour de l'enregistrement, etc, ce qui ne se passe pas ici ...NHibernate 2.0.1 Critères: exception de lancement de restriction IsNull

Voici la requête, rien de complexe, et j'ai essayé avec/sans la restriction supplémentaire MaxResults pour l'éliminer comme un problème, et pourtant, à chaque fois, l'exception est jeté avant que je puisse recueillir les résultats:

ICriteria criteria = session.GetISession().CreateCriteria(typeof (Order)).Add(NHibernate.Criterion.Restrictions.IsNull("ShippedOn")).SetMaxResults(10); 

IList<Order> entityList = criteria.List<Order>(); 

Toutes les idées ou des pointeurs vers plus d'informations qui pourraient me aider à résoudre ce problème? J'ai essayé d'utiliser HQL alternativement, les mêmes problèmes ... Ai-je manqué quelque chose ici en ce qui concerne le retour des enregistrements avec une propriété nulle spécifique?

Répondre

0

Mise à jour rapide ... mais il s'avère après un examen plus approfondi, que l'Expection est réellement levée lorsque la transaction et l'unité de travail sont terminées, et la méthode .Flush() de session est appelée. comment NHibernate essaie de gérer une propriété de champ table/DAO nullable. Lequel, même si j'ai traité dans ma classe et mappage pour la table applicable, le SQL réel mes critères avec des restrictions génère, provoque l'exception sur Flush par un problème SqlDateTime ...

Pour l'instant, mon solution de contournement a été de récupérer des enregistrements de ma première restriction et gérer la vérification IsNull dans le code au lieu de la requête. Pas aussi performant, mais jusqu'à ce que je comprenne, ça marche ...

0

J'ai vu ce genre d'exception avant quand il y a une discordance entre votre modèle de domaine, mappage et base de données. Par exemple si vous avez un champ DateTime nullable dans votre base de données, mais pas une propriété nullable sur votre modèle.

Je l'ai décrit dans a post on my blog tout à l'heure. Je ne peux pas dire avec certitude que c'est votre problème, mais cela semble certainement familier.

+0

Lien mort, fwiw. [Archive.org] (https://web.archive.org/web/20090402133829/http://blog.jagregory.com/2007/12/18/nhibernate-and-the-sqltypeexception) – ruffin

+0

C'est exactement ce que cette réponse est.Si vous lisez le billet du blog, il y a très peu d'informations supplémentaires au-delà d'un récit. Veuillez également garder à l'esprit lorsque vous faites ces suggestions que ce post a été réalisé en 2008, * long * avant que Stack Overflow ait développé son étiquette de réponse au point où il est aujourd'hui. N'hésitez pas à suggérer une modification si vous pensez que la réponse pourrait être améliorée. –

0

DateTimes ne sont pas valables dans .net. Avez-vous essayé de changer votre modèle de domaine pour utiliser DateTime? qui est nullable?

Vous pouvez obtenir des exceptions similaires à l'aide de requêtes de critères. Supposons que j'ai un objet domaine Person avec une propriété de chaîne appelée Name. Je peux construire les critères suivants:

est cependant la liste I ce critère NHibernate lancera une exception de non-concordance de type parce que je teste une chaîne contre un int. Dans les coulisses, NHIbernate effectue une vérification intelligente des types réfléchissants sur les objets mappés et lance des exceptions si les types ne sont pas alignés. (vous auriez probablement une exception SqlException si ce n'était pas si intelligent)

Questions connexes