现在,在您说出它之前:我做了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("assemblyName.Class",id) |