我想我可能发现了一个bug,但我不是很确定。这可能是我的一个语法错误,但是编译器没有捕捉到。不管怎样,这就是我想要做的。基本上,我已经编写了自己的repository类,基本上只是包装了Fluent Repository类。下面是相关代码:
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 (或者反过来)。不过,我还是能够“修复”它。在流畅的NHibernate代码中,我将Repository类的查询方法从:
return _session.Linq<T>().Where(where).ToArray(); 至
return _session.Linq<T>().Where(where.Compile()).ToArray(); 现在两个测试都通过了。Fluent NHibernate项目中的所有单元测试都通过了这两种方式。
发布于 2009-01-06 08:39:21
Fluent NHibernate邮件列表中的answer that you received很可能是正确的。也就是说,这是Linq to NHibernate中的一个错误,而不是流畅的NHibernate,这是由VB编译器生成不同于C#的表达式树造成的。
https://stackoverflow.com/questions/414272
复制相似问题