2010-05-06 3 views
3

Je suis en train de tester l'utilisation de LINQ avec NHibernate, mais j'ai rencontré des problèmes lors de la résolution de string.length. J'ai la suivanteLa requête NHibernate LINQ renvoie l'erreur "Impossible de résoudre la propriété"

public class DC_Control 
{ 
    public virtual int ID { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual bool IsEnabled { get; set; } 
    public virtual string Url { get; set; } 
    public virtual string Category { get; set; } 
    public virtual string Description { get; set; } 
    public virtual bool RequireScriptManager { get; set; } 
    public virtual string TriggerQueryString { get; set; } 
    public virtual DateTime? DateAdded { get; set; } 
    public virtual DateTime? DateUpdated { get; set; } 
} 

public class DC_ControlMap : ClassMap<DC_Control> 
{ 
    public DC_ControlMap() 
    { 
     Id(x => x.ID); 
     Map(x => x.Name).Length(128); 
     Map(x => x.IsEnabled); 
     Map(x => x.Url); 
     Map(x => x.Category); 
     Map(x => x.Description); 
     Map(x => x.RequireScriptManager); 
     Map(x => x.TriggerQueryString); 
     Map(x => x.DateAdded); 
     Map(x => x.DateUpdated); 
    } 
} 

private static ISessionFactory CreateSessionFactory() 
    { 
     return Fluently.Configure() 
      .Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008) 
      .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())) 
      .ExposeConfiguration(c => c.SetProperty("connection.connection_string", "CONNSTRING")) 
      .ExposeConfiguration(c => c.SetProperty("proxyfactory.factory_class", "NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle")) 
      .BuildSessionFactory(); 
    } 

public static void test() 
    { 
     using (ISession session = sessionFactory.OpenSession()) 
     { 
      var sqlQuery = session.CreateSQLQuery("select * from DC_Control where LEN(url) > 80").AddEntity(typeof(DC_Control)).List<DC_Control>(); 

      var linqQuery= session.Linq<DC_Control>().Where(c => c.Url.Length > 80).ToList(); 
     } 
    } 

Dans ma méthode de test, j'essaie d'abord d'effectuer la requête en utilisant SQL, cela fonctionne très bien. Ensuite, je veux faire la même chose dans LINQ, et il jette l'erreur suivante:

NHibernate.QueryException: could not resolve property: Url.Length of: DC_Control 

J'ai cherché beaucoup pour cette erreur « ne pouvait pas résoudre la propriété », mais je ne peux pas comprendre tout à fait, ce ça signifie. Est-ce parce que l'implémentation LINQ n'est pas complète? Si c'est le cas, c'est un peu décevant venant de Linq2Sql où cela fonctionnerait.

J'ai également essayé de configurer le mappage avec un fichier hbm.xml au lieu d'utiliser FluentNHibernate mais il a produit la même erreur.

+0

Vous semblez utiliser l'ancienne version de NHContrib du fournisseur Linq. Retester le fournisseur Linq dans le tronc NHibernate. –

+0

J'utilise les versions fournies avec NHibernate 2.1.2. J'ai cherché la ligne de réseau NHibernate et j'ai trouvé ceci: https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/ Mais je n'ai pas trouvé le projet LINQ. J'ai trouvé ceci cependant https://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk/src/NHibernate.Linq/ Et je l'ai juste compilé, mais produit la même erreur. En outre, je ne pouvais voir qu'un checkin depuis la sortie de 2.1.2 :( – Xorandor

Répondre

2

Les projections String.Length ne sont pas prises en charge par l'ancien fournisseur Linq (2.x).

Le nouveau fournisseur Linq dans NHibernate 3.x est intégré; vous n'avez rien à télécharger de plus. La nouvelle méthode d'extension est session.Query au lieu de session.Linq; Si vous utilisez ce dernier, vous utilisez toujours l'ancien fournisseur.

+0

Awesome! Je viens de retirer la dernière version du tronc et cela a fonctionné.Alors, en arrivant dans NHibernate 3.x, je dois attendre. – Xorandor

+0

NH 3 est plus ou moins prêt pour la production, vous n'avez pas besoin d'attendre la sortie officielle. –

Questions connexes