Fluent-NHibernateリポジトリにバグがある可能性はありますか?

StackOverflow https://stackoverflow.com/questions/414272

  •  03-07-2019
  •  | 
  •  

質問

バグを見つけたかもしれないと思うが、私にはよくわからない。かもしれない 私の側では構文エラーですが、コンパイラはキャッチしていません。とにかく、 これが私がやろうとしていることです。基本的に私は自分で書いた 基本的に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つの単体テストを作成しました。 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への型変換(または 多分逆かもしれません。)「修正」することができました。それでも。の中に 流NHなNHibernateコードリポジトリのQueryメソッドを変更しました 次のクラス:

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

to

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

両方のテストに合格しました。 Fluent NHibernateのすべてのユニットテスト プロジェクトはどちらの方法でもパスします。

役に立ちましたか?

解決

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top