关于c#:NHibernate.MappingException:没有用于XYZ的持久性

关于c#:NHibernate.MappingException:没有用于XYZ的持久性

NHibernate.MappingException: No persister for: XYZ

现在,在您说出它之前:我做了Google,而我的hbm.xml文件是嵌入式资源。

这是我正在调用的代码:

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

这是我的班级映射文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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>

有人遇到过这个问题吗?

这是完整的错误消息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
MappingException: No persister for:  HQData.Objects.SubCategory]NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName, Boolean throwIfNotFound)
 in c:\CSharp
H2.0.0
hibernate\src
Hibernate\Impl\SessionFactoryImpl.cs:766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
 in c:\CSharp
H2.0.0
hibernate\src
Hibernate\Impl\SessionFactoryImpl.cs:752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
 in c:\CSharp
H2.0.0
hibernate\src
Hibernate\Event\Default\DefaultLoadEventListener.cs:37 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
 in c:\CSharp
H2.0.0
hibernate\src
Hibernate\Impl\SessionImpl.cs:2054 NHibernate.Impl.SessionImpl.Get(String entityName, Object id)
 in c:\CSharp
H2.0.0
hibernate\src
Hibernate\Impl\SessionImpl.cs:1029 NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id)
 in c:\CSharp
H2.0.0
hibernate\src
Hibernate\Impl\SessionImpl.cs:1020 NHibernate.Impl.SessionImpl.Get(Object id)
 in c:\CSharp
H2.0.0
hibernate\src
Hibernate\Impl\SessionImpl.cs:985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject(Int32 Id)
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQData\DataAccessUtils
HibernateObjectHelper.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

更新,这是我的方案的解决方案:我已经更改了一些代码,并且没有在运行时将Assembly添加到配置文件中。


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

如果您使用的是app.config ...

1
2
3
4
5
6
7
8
.
.
    <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映射文件都应视为嵌入式资源,而不是默认内容。通过编辑文件属性中的"构建操作"属性来设置此选项。

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


我的问题是我忘记将.hbm放在映射xml的名称中。另外,请确保将其设为嵌入式资源!


我从这里得到的:

就我而言,映射类不是公共的。换句话说,代替:

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

我刚刚有:

1
class UserMap : ClassMap<user>

花了大约4个小时在谷歌搜索和stackoverflowing上,尝试了周围的所有东西,我发现了自己的错误:

我的映射文件名为.nbm.xml而不是.hbm.xml。太疯狂了


我有类似的问题,我按照以下方法解决了:

我正在使用MS SQL 2008,但是在NH配置中,我的方言不好:
NHibernate.Dialect.MsSql2005Dialect
如果我将其更正为:
NHibernate.Dialect.MsSql2008Dialect
然后一切正常,无一例外"没有持久性:..."
大卫。


要增加Amol的答案,请不要犯错误指定Interface类类型。确保指定实现类。 (即,不要使用IDomainObjectType)。不是我犯了这个错误... :)


我还在初始化期间添加了错误的程序集。我要保留的类在程序集#1中,而我的.hbm.xml文件嵌入在程序集#2中。我更改了cfg.AddAssembly(...来添加程序集2(而不是程序集1),并且一切正常。谢谢!


由于无效的映射配置而发生此错误。您应该检查为会话工厂设置.Mappings的位置。基本上在项目中搜索" .Mappings(",并确保在下面的行中指定了正确的实体类。

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

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


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

接下来将使用非泛型测试进行尝试,以确保您传递了正确的type参数。

您可以发布整个错误消息吗?


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

例如

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


如果从单独的程序集在存储库上运行测试,请确保将Hibernate.cfg.xml设置为始终在该程序集的bin目录中输出。对于我们而言,这不是真的,在某些情况下,我们遇到了上述错误。

免责声明:这可能是一些深奥的建议,因为这是我们构造存储库集成测试程序集的直接结果(即,我们从每个测试程序集到单个Hibernate.xfg.xml都有一个符号链接)


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


通过id查找对象时出现了类似的问题...
我所做的就是在类名中使用标准名称。那是
在此之前:

1
find("Class",id)

对象,所以变成这样:

1
find("assemblyName.Class",id)


推荐阅读

    linux文件常用命令?

    linux文件常用命令?,工作,地址,信息,系统,命令,目录,标准,情况,管理,常用命

    文件夹排序linux命令?

    文件夹排序linux命令?,系统,数字,信息,工作,时间,命令,管理,设备,单位,工具,

    linux怎么调用命令行?

    linux怎么调用命令行?,系统,地址,工具,工作,首页,终端,命令,密码,信息,情况,l

    压缩文件夹命令linux?

    压缩文件夹命令linux?,系统,软件,命令,工具,电脑,文件,文件名,格式,选项,目

    linux管理文件的命令?

    linux管理文件的命令?,系统,管理,工作,命令,信息,基础,目录,工具,文件,操作,l

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    linux退出文件命令行?

    linux退出文件命令行?,状态,档案,命令,电脑,编辑,文件,模式,界面,指令,键盘,l

    linux文件io命令?

    linux文件io命令?,系统,设备,时间,地址,平均,信息,服务,工具,报告,网络,嵌入

    改文件linux命令行?

    改文件linux命令行?,地址,系统,工作,信息,数字,文件,命令,设备,密码,权限,lin

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    拷贝文件夹linux命令?

    拷贝文件夹linux命令?,系统,地址,服务,信息,密码,情况,单位,项目,命令,文件,l

    进入文件夹linux命令?

    进入文件夹linux命令?,系统,密码,终端,目录,标的,一致,传播,图片,环境,工作,l

    d文件比较命令linux?

    d文件比较命令linux?,工作,系统,命令,地址,文件,信息,对比,数字,名称,一致,Li

    linux命令行文件夹?

    linux命令行文件夹?,系统,名称,文件夹,不了,命令,文件,名字,通用,数据,首次,l

    打包文件命令linux?

    打包文件命令linux?,系统,时间,工具,名称,命令,文件,目录,格式,表示,详细信

    py调用linux的命令?

    py调用linux的命令?,系统,代码,状态,环境,标准,工具,命令,文件,脚本,终端,lin

    linux删除命令文件夹?

    linux删除命令文件夹?,系统,数据,通用,文件夹,命令,文件,环境,百度,不了,名

    linux命令文件授权?

    linux命令文件授权?,系统,工具,权限,文件,档案,数字,软件,信息,时间,电脑,lin

    linux文件io命令?

    linux文件io命令?,系统,设备,时间,地址,平均,信息,服务,工具,报告,网络,嵌入

    linux中文件编辑命令?

    linux中文件编辑命令?,系统,工作,工具,信息,地址,发行,命令,第一,检测,基础,l