NHibernate.MappingException:没有持久性:XYZ

Sar*_*pps 129 .net c# nhibernate

现在,在你说之前:我做了 Google,我的hbm.xml文件嵌入式资源.

这是我要调用的代码:

ISession session = GetCurrentSession();
var returnObject =  session.Get<T>(Id);
Run Code Online (Sandbox Code Playgroud)

这是我的类的映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="HQData.Objects.SubCategory, HQData" table="SubCategory" lazy="true">
    <id name="ID" column="ID" unsaved-value="0">
      <generator class="identity" />
    </id>

    <property name="Name" column="Name" />
    <property name="NumberOfBuckets" column="NumberOfBuckets"  />
    <property name="SearchCriteriaOne" column="SearchCriteriaOne" />

    <bag name="_Businesses" cascade="all">
      <key column="SubCategoryId"/>
      <one-to-many 
         class="HQData.Objects.Business, HQData"/>
    </bag>

    <bag name="_Buckets" cascade="all">
      <key column="SubCategoryId"/>
      <one-to-many
         class="HQData.Objects.Bucket, HQData"/>
    </bag>

  </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过这个问题?

这是完整的错误消息:

MappingException: No persister for:  HQData.Objects.SubCategory]NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName, Boolean throwIfNotFound)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Event\Default\DefaultLoadEventListener.cs:37 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:2054 NHibernate.Impl.SessionImpl.Get(String entityName, Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1029 NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1020 NHibernate.Impl.SessionImpl.Get(Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject(Int32 Id)
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQData\DataAccessUtils\NHibernateObjectHelper.cs:42 HQWebsite.LocalSearch.get_subCategory()
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:17 HQWebsite.LocalSearch.Page_Load(Object sender, EventArgs e)
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:27 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive() +47 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

更新,这里就是为解决我的情况是:我已经改变了一些代码,我在运行时没有加入大会的配置文件.

And*_*y S 98

听起来好像忘了将映射程序集添加到会话工厂配置中.

如果您正在使用app.config ...

.
.
    <property name="show_sql">true</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <mapping assembly="Project.DomainModel"/>  <!-- Here -->
</session-factory>
.
.
Run Code Online (Sandbox Code Playgroud)

  • 如何在Fluent NHibernate中执行此操作,我正在开发一个serperate项目中的模式,所以我无法访问用户程序集? (7认同)

Chr*_*dis 87

显而易见的东西,但对NHibernate新手来说非常有用.

应将所有XML映射文件视为嵌入式资源,而不是默认内容.通过编辑文件属性中的"构建操作"属性来设置此选项.

然后将XML文件嵌入到程序集中,并在NHibernate的配置阶段在项目启动时进行解析.


小智 48

我的问题是我忘了将.hbm放在映射xml的名称中.还要确保将其作为嵌入式资源!


bas*_*rat 42

我从这里得到了这个:

在我的情况下,映射类不公开.换句话说,而不是:

public class UserMap : ClassMap<user>  // note the public!
Run Code Online (Sandbox Code Playgroud)

我刚才:

class UserMap : ClassMap<user>
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是Fluent,我会说这是更常见的原因。谢谢,这很容易错过。 (2认同)

Nic*_*ich 27

google搜索stackoverflowing上花了大约4个小时,尝试了那里的所有东西,我发现了我的错误:

我的映射文件名为.nbm.xml,除了.hbm.xml.那太疯狂了.

  • 唉,只是做了同样的事情,除了我有.xml而不是.hbm.xml.也许错误中应该有一些提示:) (9认同)
  • 哈哈,我第一次听到"stackoverflowing"的表达 (5认同)
  • 我的天啊.我不敢相信我这样做了.我在映射文件中搜索错误数小时,结果发现我在文件名中输了一个错误... doh.谢谢!如果我没有偶然发现这一点,我会想我多长时间都会撕裂我的头发. (2认同)