【问题标题】:NHibernate and LINQ - InvalidOperationException: "Could not find entity named ..."NHibernate 和 LINQ - InvalidOperationException:“找不到名为...的实体”
【发布时间】:2009-11-20 18:42:43
【问题描述】:

看看以下测试:

[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)。测试二失败,但有异常:

System.InvalidOperationException: 找不到名为: BOM.Domain.Action.

事实证明,在 where 条件中使用实体的每个 linq 表达式都会失败,并出现此异常。删除 where 将使它通过,但这当然不是我想要实现的。我错过了什么?为什么会出现这个异常?


更新:

我创建了一个单独的项目,如下所示。

领域对象:

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>

单元测试初始化​​创建一个 SQL CE 数据库文件,看起来没问题。测试非常相似,而且我的行为与以前相同:使用 ICriteria 获取工作正常,使用 Linq 获取工作正常,直到我添加与域对象相关的条件。和以前一样的 InvalidOperationException,这里是堆栈跟踪:

测试方法Tests.ReadTests.CanReadWithLinq 抛出 例外: System.InvalidOperationException: 找不到名为: 域.TestEntity。在 NHibernate.Linq.Util.CriteriaUtil.GetRootType(CriteriaImpl 标准)在 NHibernate.Linq.Util.CriteriaUtil.GetRootType(ICriteria 标准)在 NHibernate.Linq.Visitors.MemberNameVisitor.IsRootEntity(EntityExpression expr) 在 NHibernate.Linq.Visitors.MemberNameVisitor.VisitEntity(EntityExpression expr) 在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.VisitPropertyAccess(PropertyAccessExpression expr) 在 NHibernate.Linq.Visitors.MemberNameVisitor.VisitPropertyAccess(PropertyAccessExpression expr) 在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.MemberNameVisitor.GetMemberName(ICriteria rootCriteria,表达式 expr) 在 NHibernate.Linq.Visitors.BinaryCriterionVisitor.VisitPropertyAccess(PropertyAccessExpression expr) 在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.BinaryCriterionVisitor.GetBinaryCriteria(ICriteria rootCriteria,ISession 会话, BinaryExpression expr, 比较PropToValue comparePropToValue, 比较PropToProp 比较PropToProp, 比较值到标准 比较ValueToCriteria, 比较PropToCriteria comparePropToCriteria) 在 NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitBinaryCriterionExpression(BinaryExpression expr) 在 NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitBinary(BinaryExpression expr) 在 NHibernate.Linq.Visitors.ExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.ExpressionVisitor.VisitLambda(LambdaExpression λ) 在 NHibernate.Linq.Visitors.ExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitUnary(UnaryExpression expr) 在 NHibernate.Linq.Visitors.ExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.WhereArgumentsVisitor.GetCriterion(ICriteria rootCriteria,ISession 会话, 表达式表达式)在 NHibernate.Linq.Visitors.RootVisitor.HandleWhereCall(MethodCallExpression 打电话)在 NHibernate.Linq.Visitors.RootVisitor.VisitMethodCall(MethodCallExpression expr) 在 NHibernate.Linq.Visitors.ExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式 exp)在 NHibernate.Linq.Visitors.NHibernateQueryTranslator.Translate(表达式 表达式,查询选项查询选项) 在 NHibernate.Linq.NHibernateQueryProvider.TranslateExpression(表达式 表达式)在 NHibernate.Linq.NHibernateQueryProvider.Execute(表达式 表达式)在 NHibernate.Linq.Query1.GetEnumerator() at System.Linq.Enumerable.FirstOrDefault<TSource>(IEnumerable1 来源)在 Tests.ReadTests.CanReadWithLinq() 在 ReadTests.cs:第 52 行。

【问题讨论】:

  • 我很确定问题不在您显示的代码中...您能发布更多代码吗?
  • 当然不是。但是我不知道应该发布代码的哪一部分而不会使问题变得不可读。我希望有人说“啊,当一切都很好但只有 Linq 语句因 InvalidOperationException 而崩溃时,你应该检查......”
  • 有趣的是:google.de/search?q="Could+not+find+entity+named"+linqgoogle.de/… 都没有结果——所以这个问题似乎非常模糊和罕见。

标签: linq nhibernate linq-to-nhibernate


【解决方案1】:

我认为这是 XML 映射文件的问题。您能否检查您的文件 Action.hbm.xml,执行“F4”并将“Build Action”设置为“Embedded Resource”。

【讨论】:

  • 这不是问题。我正在使用 NHibernate.Attributes 并即时创建映射文档。此外,如果这是问题所在,则其他测试将无法通过。但是,即使使用静态映射 xml,同样的问题仍然存在。
【解决方案2】:

在获取 NHibernate 和 NHibernate Contrib 源并逐步完成后解决了这个问题:我必须在创建 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")]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2013-06-06
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多