Fluent-NHibernateリポジトリにバグがある可能性はありますか?
-
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#に対して異なる式ツリーを生成するために発生します。
所属していません StackOverflow