0

次のテストを見てください。

[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>(IEnumerable1つのソース)ReadTests.csのTests.ReadTests.CanReadWithLinq():52行目。

4

2 に答える 2

1

XMLマッピングファイルに問題があると思います。ファイルAction.hbm.xmlを確認し、「F4」を実行して、「BuildAction」を「EmbeddedResource」に設定してください。

于 2009-11-19T07:54:57.877 に答える
0

NHibernateおよびNHibernateContribソースをフェッチし、ステップスルーした後に解決しました。INHibernateQueryableを作成するときに、データベースからエンティティ名を指定する必要があります。

IEnumerable<TestEntity> query = from testEntity in session.Linq<TestEntity>("T_TestEntity") 
    where testEntity.CreatedOn < DateTime.Now
    select testEntity;

これが最終的な解決策かどうかはまだわかりません。


アップデート

マッピングドキュメントは、テーブル名の代わりにエンティティ名を定義しました。これにより、エクスポート時に正しいスキーマが作成され、既存のスキーマを処理することもできました。ただし、Linqでは動作が異なります。正しいマッピング定義は次のとおりです。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class table="T_TestEntity" name="Domain.TestEntity, Domain">
    <id name="Id" />
    <property name="CreatedOn" column="CreatedOn" />
  </class>
</hibernate-mapping>

または(NHibernate Contribの属性マッピングを使用する場合):

[Class(Name = "Domain.TestEntity, Domain", Table = "T_TestEntity")]
于 2009-11-19T09:23:50.117 に答える