次のテストを見てください。
[TestMethod]
public void CanRead()
{
using (ISession session = OpenSession())
{
var criteria = session.CreateCriteria(typeof(Action));
var result = criteria.List<Action>();
Assert.IsTrue(result.Count > 0);
}
}
[TestMethod]
public void CanReadWithLinq()
{
using (ISession session = OpenSession())
{
IEnumerable<Action> actionQuery = from action in session.Linq<Action>()
where action.CreatedOn < DateTime.Now
select action;
List<Action> actions = actionQuery.ToList();
Assert.IsNotNull(actions);
Assert.IsTrue(actions.Count > 0);
}
}
Action
最初のものが実行されるので、マッピングは正しいと思います(クラスでNHibernate.Attributesを使用)。テスト2は、次の例外を除いて失敗します。
System.InvalidOperationException:BOM.Domain.Actionという名前のエンティティが見つかりませんでした。
where条件でエンティティを使用するすべてのlinq式は、この例外を除いて失敗することがわかりました。場所を削除すると通過しますが、もちろんこれは私が達成したいことではありません。私は何が欠けていますか?なぜこの例外があるのですか?
アップデート:
次のように別のプロジェクトを作成しました。
ドメインオブジェクト:
namespace Domain
{
public class TestEntity
{
public Guid Id { get; set; }
public DateTime CreatedOn { get; set; }
}
}
マッピングドキュメント:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class entity-name="T_TestEntity" name="Domain.TestEntity, Domain" lazy="false">
<id name="Id" />
<property name="CreatedOn" column="CreatedOn" />
</class>
</hibernate-mapping>
単体テストの初期化により、SQLCEデータベースファイルが作成されます。これは問題ないようです。テストは非常によく似ており、以前と同じ動作をします。ドメインオブジェクトに関連する条件を追加するまで、ICriteriaを使用したフェッチは正常に機能し、Linqを使用したフェッチは正常に機能します。以前と同じInvalidOperationException、ここではスタックトレース:
テストメソッドTests.ReadTests.CanReadWithLinqが例外をスローしました:System.InvalidOperationException:Domain.TestEntityという名前のエンティティが見つかりませんでした。NHibernate.Linq.Util.CriteriaUtil.GetRootType(CriteriaImpl基準)at NHibernate.Linq.Util.CriteriaUtil.GetRootType(ICriteria基準)at NHibernate.Linq.Visitors.MemberNameVisitor.IsRootEntity(EntityExpression expr)at NHibernate.Linq.Visitors .VisitEntity(EntityExpression expr)at NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(Expression exp)at NHibernate.Linq.Visitors.NHibernateExpressionVisitor.VisitPropertyAccess(PropertyAccessExpression expr)at NHibernate.Linq.Visitors.MemberName .Linq.Visitors.NHibernateExpressionVisitor。
1.GetEnumerator() at System.Linq.Enumerable.FirstOrDefault<TSource>(IEnumerable
1つのソース)ReadTests.csのTests.ReadTests.CanReadWithLinq():52行目。