NHibernate.MappingException:没有persister:XYZ

现在,在你说之前:我做了 Google,我的hbm.xml文件一个embedded式资源。

这是我打电话的代码:

 ISession session = GetCurrentSession(); var returnObject = session.Get<T>(Id); 

这是我的类的映射文件:

 <?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> 

有没有人跑过这个问题?

以下是完整的错误消息:

  MappingException:没有persist:HQData.Objects.SubCategory] ​​NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName,Boolean throwIfNotFound)
 在c:\ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs:766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
 在C:\ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs:752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent事件,LoadType loadType)
 在C:\ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Event \ Default \ DefaultLoadEventListener.cs:37 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent事件,LoadType loadType)
 在C:\ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs:2054 NHibernate.Impl.SessionImpl.Get(String entityName,Object id)
 在C:\ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs:1029 NHibernate.Impl.SessionImpl.Get(Type entityClass,Object id)
 在c:\ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs:1020 NHibernate.Impl.SessionImpl.Get(Object id)
 在C:\ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs:985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject(Int32 Id)
 在C:\ Development \ HQChannelRepo \ HQ频道应用程序\ HQChannel \ HQData \ DataAccessUtils \ NHibernateObjectHelper.cs中:42 HQWebsite.LocalSearch.get_subCategory()
 在C:\ Development \ HQChannelRepo \ HQ频道应用程序\ HQChannel \ HQWebsite \ LocalSearch.aspx.cs中:17 HQWebsite.LocalSearch.Page_Load(Object sender,EventArgs e)
 在C:\ Development \ HQChannelRepo \ HQ频道应用程序\ 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(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+1436 

更新 ,这里是我的scheme的解决scheme是:我已经改变了一些代码,我没有在运行时将configuration文件添加到configuration文件。

听起来像你忘了添加一个映射程序集的会议工厂configuration..

如果你正在使用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> . . 

有些东西很明显,但是对于一个新来NHibernate的人来说非常有用。

所有的XML映射文件应被视为embedded式资源而不是默认的内容 。 此选项通过编辑文件属性中的“生成操作”属性进行设置。

然后将XML文件embedded到程序集中,并在NHibernate的configuration阶段在项目启动时进行parsing。

我的问题是,我忘了把映射XML名称.hbm。 还要确保你使它成为一个embedded式资源!

我从这里得到了这个:

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

 public class UserMap : ClassMap<user> // note the public! 

我刚刚有:

 class UserMap : ClassMap<user> 

花费大约4个小时在Googlesearch,并尝试所有的东西,我发现我的错误:

我的映射文件被称为.nbm.xml,除了.hbm.xml 。 这是疯了。

我也有类似的问题,我把它解释为:

我在MS SQL 2008上工作,但是在NHconfiguration中我使用了不好的方言:NHibernate.Dialect。 MsSql2005Dialect,如果我改正它:NHibernate.Dialect。 MsSql2008Dialect然后一切工作正常,没有例外“没有persister:…”David。

要添加到Amol的答案,请不要指定接口类types的错误。 确保你指定了实现类 。 (即不要使用IDomainObjectType)。 不是我犯了这个错误… 🙂

应该是name="Id" ? 错别字是可能的原因。

接下来就是用一个非genericstesting来testing它,以确保你传递的是正确的types参数。

你能发布整个错误信息吗?

我有同样的问题,因为我在Configuration.AddAssembly()方法中添加了错误的程序集。

初始化期间,我还添加了错误的程序集。 我坚持的类是在程序集#1中,我的.hbm.xml文件embedded在程序集#2中。 我改变了cfg.AddAssembly(...来添加组件#2(而不是组件#1),一切正常。谢谢!

如果从一个单独的程序集在版本库上运行testing,那么确保你的Hibernate.cfg.xml被设置为总是在所说的程序集的bin目录中输出。 这并没有发生,我们在某些情况下得到了上述错误。

免责声明:这可能是一个稍微深奥的build议,因为这是我们如何构build我们的资源库集成testing程序集的直接结果(即,我们有从每个testing程序集到单个Hibernate.xfg.xml的符号链接)

不要忘记在.config文件中指定映射信息

例如

其中MyApp.Data是包含映射的程序集

发生此错误是因为无效的映射configuration。 你应该检查你为会议工厂设置.Mappings。 基本上在您的项目中search“.Mappings(”),并确保您在下面的行中指定了正确的实体类。

 .Mappings(m => m.FluentMappings.AddFromAssemblyOf<YourEntityClassName>()) 

当通过idfind一个对象时有类似的问题…我所做的只是在类名中使用完全限定的名称。 那是在之前:

 find("Class",id) 

对象,所以它变成这样:

 find("assemblyName.Class",id) 

确保您已经在Session上调用了您想要从数据库中获取的域对象的CreateCriteria(typeof(DomainObjectType))方法。