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.