1

バグを見つけたかもしれないと思いますが、よくわかりません。これは私の側の構文エラーである可能性がありますが、コンパイラはキャッチしていません。とにかく、これが私がやろうとしていることです。基本的に、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 

次に、2 つの単体テストを作成しました。1 つは InMemoryRepository を渡すテストで、もう 1 つは実際の 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 (またはその逆) への型変換でした。ただし、「修正」することはできました。Fluent NHibernate コードで、Repository クラスの Query メソッドを次のように変更しました。

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

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

これで両方のテストがパスします。Fluent NHibernate プロジェクトの単体テストはすべて、どちらの方法でも合格します。

4

1 に答える 1

2

Fluent NHibernate メーリング リストで受け取った回答は、おそらく正しいものです。つまり、Fluent NHibernate ではなく Linq to NHibernate のバグであり、VB コンパイラが C# に対して異なる式ツリーを生成することが原因です。

于 2009-01-06T08:39:21.220 に答える