2009-01-05 4 views
1

Je pense que j'ai peut-être trouvé un bug, mais je ne suis pas vraiment sûr. Il peut s'agir d'une erreur de syntaxe de ma part, mais le compilateur n'attrape pas. Quoi qu'il en soit, voici ce que j'essaie de faire. Fondamentalement, j'ai écrit ma propre classe de dépôt qui ne fait qu'encapsuler la classe Fluent Repository . Donc, est ici le code correspondant:Bug possible dans le référentiel Fluent-NHibernate?

Public Class GenericRepository(Of T As IHasIntId) 
    Private _fluentRepos As FluentNHibernate.Framework.IRepository 
    Public Sub New(ByVal FluentRepository As 
FluentNHibernate.Framework.IRepository) 
     _fluentRepos = FluentRepository 
    End Sub 
    Private Sub New() 
    End Sub 
    Public Function GetById(ByVal Id As Integer) As T 
     Return Query(Function(x As T) (x.Id = Id)).FirstOrDefault 
    End Function 
    Public Function Query(ByVal w As Expression(Of System.Func(Of T, 
Boolean))) As IList(Of T) 
     Return _fluentRepos.Query(Of T)(w).ToList() 
    End Function 
End Class 

Puis j'ai écrit deux tests unitaires, qui passerait dans un InMemoryRepository et qui utiliserait une session NHibernate réelle de frapper la base de données réelle. ici, ils sont:

<TestMethod()> Public Sub InMemoryTest() 
     Dim inmemRepos As New InMemoryRepository() 
     Dim p As New Product() 
     Dim id As Integer = 5 
     p.Id = id 
     p.Title = "my product" 
     inmemRepos.Save(p) 
     Dim genRepos As New GenericRepository(Of Product)(inmemRepos) 
     Dim foundP = genRepos.GetById(id) 
     Assert.AreEqual(p.Title, foundP.Title) 
    End Sub 

    <TestMethod()> Public Sub DatabaseTest() 
     Dim session = NHibernateSessionManager.Instance.GetSession() 
     Dim flRepos As New Repository(session) 
     Dim genRepos As New GenericRepository(Of Product)(flRepos) 
     Dim id As Integer = 1 
     Dim p = genRepos.GetById(id) 
     Assert.IsNotNull(p) 
     Assert.AreEqual(id, p.Id) 
    End Sub 

Le InMemoryTest passé, et l'DatabaseTest a échoué. L'exception de DatabaseTest était une conversion de type, de int à produit (ou peut-être l'inverse.) J'ai pu "réparer" cependant. Dans le Fluent NHibernate J'ai changé la méthode de requête sur le référentiel classe de:

return _session.Linq<T>().Where(where).ToArray(); 

à

return _session.Linq<T>().Where(where.Compile()).ToArray(); 

maintenant passer les deux tests. Tous les tests unitaires du projet Fluent NHibernate sont dans les deux cas.

Répondre

2

Le answer that you received sur la liste de diffusion Fluent NHibernate est probablement le bon. C'est-à-dire que c'est un bogue dans Linq à NHibernate plutôt que Fluent NHibernate, causé par le fait que le compilateur VB produise des arbres d'expression différents en C#.