2009-01-05 26 views
1

我想我可能找到了一個錯誤,但我並不確定。它可能是 我的一個語法錯誤,但編譯器不捕捉。無論如何, 這是我想要做的。基本上我寫了自己的 存儲庫類,基本上只包裝了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 項目中進行的單元測試都通過任何方式。

回答

2

Fluent NHibernate郵件列表上的answer that you received最有可能是正確的。也就是說,這是NHibernate的Linq中的一個錯誤,而不是Fluent NHibernate,這是由VB編譯器爲C#生成不同的表達式樹造成的。