现在,在你说之前:我 做过 谷歌和我的 hbm.xml 文件 嵌入式资源。

这是我调用的代码:

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

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

有帮助吗?

解决方案

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

如果您使用的是 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 映射文件都应被视为 嵌入式资源 而不是默认的 内容. 。通过编辑文件属性中的“构建操作”属性来设置此选项。

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

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

我把这个从 这里:

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

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

我刚刚有:

class UserMap : ClassMap<user>

花费约4小时 谷歌搜索堆栈溢出, ,尝试了那里的所有东西,我发现了我的错误:

我的映射文件被称为 .nbm.xml 代替 .hbm.xml. 。那太疯狂了。

我有类似的问题,我解决如下:

我在 MS SQL 2008 上工作,但在 NH 配置中我的方言很糟糕:NHibernate.方言。MsSql2005方言如果我将其更正为:NHibernate.方言。MsSql2008方言然后一切工作正常,无一例外“没有持久者:...“ 大卫。

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

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

应该是 name="Id"?拼写错误是一个可能的原因。

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

您能发布完整的错误消息吗?

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

出现此错误的原因是映射配置无效。您应该检查您为会话工厂设置 .Mappings 的位置。基本上在您的项目中搜索“.Mappings(”,并确保您在下面的行中指定了正确的实体类。

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

如果从单独的程序集在存储库上运行测试,请确保将 Hibernate.cfg.xml 设置为始终在所述程序集的 bin 目录中输出。这并没有发生在我们身上,并且在某些情况下我们遇到了上述错误。

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

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

例如

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

通过 id 查找对象时遇到类似的问题...我所做的就是在类名中使用完全限定名称。那是:

find("Class",id)

对象所以就变成了这样:

find("assemblyName.Class",id)

确保您已致电 CreateCriteria(typeof(DomainObjectType)) 您打算从数据库获取的域对象的会话上的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top