Nhibernate:QuerySyntaxException:未映射'Class'

时间:2009-07-19 13:01:19

标签: nhibernate

我有以下课程:

public class MyClass
{
    private List<long> _myList = new List<long>();

    public virtual string MyID { get; set; }

    public virtual string MyData
    {
        get
        {
            return SomeStaticClass.Serialize(_myList);
        }
        set
        {
            _myList = SomeStaticClass.Deserialize<List<long>>(value);
        }
    }

    public virtual List<long> MyList
    {
        get { return _myList; }
    }
}

以下映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="MyNamespace"
               namespace="MyNamespace">
  <class name="MyNamespace.MyClass" table="MY_TABLE">
    <id name="MyID" column="MY_ID" type="System.String">
      <generator class="assigned"></generator>
    </id>
    <property name="MyData" column="MY_DATA"></property>
  </class>
</hibernate-mapping>

当我尝试运行以下行时:

session.Delete("From MyClass m");

我收到一条QuerySyntaxException,消息“MyClass未映射[来自MyClass s]”。

当我在映射文件中将“MyID”字段的名称更改为“ID”时,异常变为

NHibernate.PropertyNotFoundException:在“MyNamespace.MyClass”类中找不到属性“ID”的getter。

所以我假设它可以找到映射文件。我确保映射文件是一个嵌入式资源,检查并dobule检查映射文件中的命名空间和类名。什么可能导致错误?我认为它可能与未映射的MyList属性有关,但我不确定,因为我在其他类上使用非映射属性而没有问题。

编辑:我尝试重写此类,其中一个类没有“MyData”属性,并将“MyList”属性重新定义为字符串。对于我被覆盖的课程,我仍然收到同样的错误。

编辑2:尝试使用一个非常简单的类,它具有相同的返回类型的属性名称,只有简单的get;组;块。我仍然得到同样的错误。我几乎可以肯定nhibernate可以看到我的映射文件,因为如果我更改单个属性的名称,它会给我PropertyNotFound而不是“class in not mapped”。

8 个答案:

答案 0 :(得分:8)

你是如何加载hbms的?如果它们是资源,请确保您实际上已将文件设置为Visual Studio中的嵌入资源

答案 1 :(得分:7)

如果是映射

<class name="MyClass" table="MY_TABLE">

你应该使用,例如:

session.CreateQuery("from MyClass")

但不是:

session.CreateQuery("from MY_TABLE")

答案 2 :(得分:5)

如果你使用

怎么办?
session.Delete("From MyNamespace.MyClass m");

我只是看HQL引用,并在他们的cat示例中注意到它们使用完全限定的对象,即Eg.Cat。

答案 3 :(得分:3)

确保“文件的构建操作”是“嵌入式资源”。

答案 4 :(得分:3)

您应该将相关的* .hbm.xml设置为嵌入式资源。

1]

答案 5 :(得分:1)

我有这个问题。我忘了将hbm放在映射XML文件的名称中。

答案 6 :(得分:0)

在映射文件中两次指定命名空间似乎有点奇怪。我会尝试将name属性指定为“MyClass”而不是“MyNamespace.MyClass”,因此它将是

<class name="MyClass" table="MY_TABLE">

答案 7 :(得分:0)

我遇到了类似的问题。基本上,我在解决方案中包含了一个新项目,并且我没有在 hibernate.cfg.xml 文件中映射命名空间。