繁体   English   中英

NHibernate.MappingException:没有持久性:XYZ

[英]NHibernate.MappingException: No persister for: XYZ

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

这是我调用的代码:

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

这是我的 class 的映射文件:

<?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) 在 c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:752 NHibernate.Event.Default.DefaultTypeLoadEventListener.OnLoad(LoadEventListener.OnLoad) 事件中c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Event\Default\DefaultLoadEventListener.cs:37 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent 事件, LoadType 加载类型) c:\CSharp0.0NH 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, 8  8293612309888 id) c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1020 NHibernate.Impl.SessionImpl.Get(Object id) 88112844465588:\2CSharp \NHibernate\Impl\SessionImpl.cs:985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject(Int32 Id) 在 C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQData\DataAccessUtils\NHibernateObjectHelper.cs.getal HQWebsitegory.cs.getal ) 在 C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:17 HQWebsite.LocalSearch.Page_Load(Object sender, EventArgs e) 在 C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\ hqwebsite \ localsearch.aspx.cs:27 System.Web.UTIL.CALLIHELPER.CALLIHELPER.EVENTARGFUNCTICTCALLER(INTPTR FP,Object O,8829361230988T,Eventrants +Eventrant.15888888888888888.88.888888888888888888888888888888888888888888888888888 33 系统.Web.U  I.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 映射文件都应该被视为嵌入式资源而不是默认的Content 此选项是通过编辑文件属性中的构建操作属性来设置的。

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

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

我从这里得到了这个:

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

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

我刚有:

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(”,并确保您在下面的行中指定了正确的实体类。

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

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

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

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

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

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

例如

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

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

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

我有一个类似的问题,但所有提到的要求都得到满足。 就我而言,我尝试将一些实体类(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 存储库本身。 无论如何。 我下次继续这个重新分配黑客。

我的情况是我在没有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, Version=5.3.0.0,文化=中性,PublicKeyToken=aa95f207798dfdb4]]

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

find("Class",id)

对象所以它变成了这样:

find("assemblyName.Class",id)

你会认为 14 年后,这个问题所有可能的答案都被写下来了。 好像不是这样的。

在我目前正在处理的应用程序中,有几个ISessionFactory实例,每个实例对应一个不同的数据库。

如果您使用错误的方法来创建ISession ,那么它当然不知道您要坚持的 class ,这是我的错误。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM