我想我可能找到了一个错误,但我并不确定。它可能是 我的一个语法错误,但编译器不捕捉。无论如何, 这是我想要做的。基本上我写了自己的 存储库类,基本上只包装了Fluent存储库 类。因此,这里的相关代码: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
然后我写了两个单元测试,一个会传递一个 InMemoryRepository和一个会用实际NHibernate的会议 打真正的数据库。 这里,他们是:
<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
的InMemoryTest过去了,DatabaseTest失败。 DatabaseTest中的例外 是一种从int到product的类型转换(或者也可能是其他方式)。我能够“修复”它。
return _session.Linq<T>().Where(where).ToArray();
到
return _session.Linq<T>().Where(where.Compile()).ToArray();
现在,这两个测试通过:在 功能NHibernate代码,我从改变了存储库 类的查询方法。所有在Fluent NHibernate 项目中进行的单元测试都通过任何方式。