NHibernate.MappingException:没有持久性:XYZ

时间:2008-09-11 22:27:06

标签: c# .net nhibernate

现在,在您说出来之前:我做了 Google和我的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

更新,以下是 my 方案的解决方案:我更改了一些代码,而我在运行时没有将Assembly添加到配置文件中。

17 个答案:

答案 0 :(得分:95)

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

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

答案 1 :(得分:85)

显而易见的东西,但对于刚接触NHibernate的人来说非常有用。

所有XML Mapping文件都应被视为嵌入式资源,而不是默认的内容。通过编辑文件属性中的“构建操作”属性来设置此选项。

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

答案 2 :(得分:48)

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

答案 3 :(得分:40)

我从here得到了这个:

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

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

我刚才:

class UserMap : ClassMap<user>

答案 4 :(得分:26)

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

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

答案 5 :(得分:3)

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

我正在研究MS SQL 2008,但在NH配置中我的方言不好: NHibernate.Dialect。的 MsSql2005Dialect 如果我纠正它: NHibernate.Dialect。的 MsSql2008Dialect 然后一切正常,没有例外“没有持久性:...” 大卫。

答案 6 :(得分:3)

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

答案 7 :(得分:3)

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

答案 8 :(得分:2)

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

接下来将尝试使用非通用测试来确保您传入正确的类型参数。

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

答案 9 :(得分:2)

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

答案 10 :(得分:2)

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

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

答案 11 :(得分:1)

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

e.g。

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

答案 12 :(得分:1)

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

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

答案 13 :(得分:0)

按ID查找对象时遇到类似问题... 我所做的就是在类名中使用完全限定名。那是 在此之前:

find("Class",id)

对象所以它变成了这样:

find("assemblyName.Class",id)

答案 14 :(得分:0)

确保您已在Session上为您想要从DB获取的域对象调用CreateCriteria(typeof(DomainObjectType))方法。

答案 15 :(得分:0)

我有一个类似的问题,但满足了所有提到的要求。就我而言,我尝试将某些实体类(OBJEKTE类型)保存回数据库。其他地方也可以使用,但仅在这种情况下,它会失败并引发此异常。

我的解决方案(HACK)是再次重新映射OBJEKTE类型的对象,然后将其存储。突然它起作用了。但是不要问为什么。

            OBJEKTE t = _mapper.Map<OBJEKTE>(inparam);
            OBJEKTE res = await _objRepo.UpdateAsync(t);

如果inparam直接进入UpdateAsync(),它将找不到匹配的持久化器。

可以用NH的方式来解释。它从您的映射类派生代理,并实现包含脏处理的属性。看到这个:

t.GetType()
{Name = "OBJEKTE" FullName = "MyComp.Persistence.OBJEKTE"}

inparam.GetType()
{Name = "OBJEKTEProxyForFieldInterceptor" FullName = "OBJEKTEProxyForFieldInterceptor"}

有趣的是,inparam的来源实际上是NH存储库本身。无论如何。下次我将继续使用此重新分配技巧。

答案 16 :(得分:0)

我的情况是,我获取的实体没有await

var company = _unitOfWork.Session.GetAsync<Company>(id);

然后我试图将其删除:

await _unitOfWork.Session.DeleteAsync(company);

我无法破译我正在删除Task<Company>而不是Company的错误消息:

MappingException:无持久性:System.Runtime.CompilerServices.AsyncTaskMethodBuilder'1 + AsyncStateMachineBox'1 [[SmartGuide.Core.Domain.Users.Company,SmartGuide.Core,Version = 2.0.0.0,Culture = neutral ,PublicKeyToken = null],[NHibernate.Impl.SessionImpl + d__54`1 [[SmartGuide.Core.Domain.Users.Company,SmartGuide.Core,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = null]],NHibernate,版本= 5.3.0.0,文化=中性,PublicKeyToken = aa95f207798dfdb4]]