异常: 不持久化: XYZ

现在,在你说之前: 我的 是的谷歌和我的 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

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

141701 次浏览

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

接下来将使用一个非泛型测试来尝试它,以确保您传入了正确的类型参数。

您能发布整个错误消息吗?

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

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

如果从一个独立的程序集运行对存储库的测试,那么确保 Hibernate.cfg.xml 被设置为总是在该程序集的 bin 目录中输出。这不是发生在我们身上,我们在某些情况下得到了上述错误。

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

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

find("Class",id)

所以它变成了这样:

find("assemblyName.Class",id)

一些显而易见的东西,但对于刚刚接触 NHibernate 的人来说还是很有用的。

所有 XML 映射文件都应该被视为 嵌入式资源,而不是默认的 内容。通过编辑文件属性中的 BuildAction 属性来设置此选项。

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

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

例如:。

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

我也遇到过类似的问题,我解决的方法如下:

我使用的是 MS SQL 2008,但在 NH 配置中,我的方言很糟糕: NHibernate 方言 MsSql2005方言 如果我改成: NHibernate 方言 MsSql2008方言 那么一切都很好,没有例外“没有坚持: ... ...” 大卫。

我的问题是我忘了把。以映射 xml 的名称命名 hbm。还要确保它是一个嵌入式资源!

我从 给你台拿到的:

在我的例子中,映射类不是公共的,换句话说,不是:

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

我只有:

class UserMap : ClassMap<user>

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

我还在初始化期间添加了错误的程序集。我坚持的类在程序集 # 1中,而我的。Xml 文件嵌入在程序集 # 2中。我改变了 cfg.AddAssembly(...,添加了组装 # 2(而不是组装 # 1) ,所有的工作。谢谢!

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

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

花了大约4个小时在 谷歌一下堆满了上,尝试了周围的所有东西,我发现了我的错误:

我的映射文件被命名为 . nbm.xml,而不是 . hbm.xml

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

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

我有一个类似的问题,但所有提到的 规定是满足。在我的例子中,我尝试将一些实体类(类型为 ObjecKTE)保存回数据库。其他地方确实工作,但只有在这种情况下,它失败,并提出这种异常。

我的解决方案(HACK)是重新映射 ObjeckTE 类型的对象,然后存储它。突然之间就成功了。但别问为什么。

            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 的持久化程序。运行时间。编译服务。AsyncTaskMethodBuilder’1 + AsyncStateMachineBox’1[[ SmartGuide。核心。域名。用户。公司,智能指南。Core,Version = 2.0.0.0.0,Culture = Central,PublicKeyToken = null ] ,[ NHibernate.暗示。SessionImpl + d _ _ 54‘1[[ SmartGuide ]。核心。域名。用户。公司,智能指南。核心,版本 = 2.0.0.0,文化 = 中立,PublicKeyToken = null ]] ,NHibernate,版本 = 5.3.0.0,文化 = 中立,PublicKeyToken = aa95f207798dfdb4]

你可能会认为,14年后,这个问题的所有可能的答案都被写下来了。看来情况并非如此。

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

如果创建 ISession时使用了错误的函数,那么它当然不会知道要持久化的类,这就是我的例子中的错误。