NHibernate.MappingException: не сохраняется для: XYZ - PullRequest
129 голосов
/ 12 сентября 2008

Теперь, прежде чем вы это скажете: я сделал 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

Обновление , вот каково было решение для моего сценария: я изменил некоторый код и не добавлял Assembly в файл конфигурации во время выполнения.

Ответы [ 15 ]

2 голосов
/ 12 сентября 2008

Должно ли это быть name="Id"? Опечатки являются вероятной причиной.

Далее следует попробовать его с помощью нестандартного теста, чтобы убедиться, что вы передаете правильный параметр типа.

Можете ли вы опубликовать сообщение об ошибке полностью?

1 голос
/ 11 марта 2010

Не забудьте указать информацию о сопоставлении в файле .config

например.

где MyApp.Data - сборка, содержащая ваши сопоставления

1 голос
/ 05 марта 2009

Если вы запускаете тесты в репозитории из отдельной сборки, убедитесь, что ваш Hibernate.cfg.xml всегда настроен на вывод в каталоге bin указанной сборки. Это не произошло для нас, и мы получили вышеуказанную ошибку при определенных обстоятельствах.

Отказ от ответственности: Это может быть немного эзотерическим советом, учитывая, что это является прямым результатом того, как мы структурируем наши тестовые сборки интеграции репозитория (т. Е. У нас есть символическая ссылка из каждой тестовой сборки на один файл Hibernate.xfg.xml)

0 голосов
/ 09 сентября 2011

Убедитесь, что вы вызвали метод CreateCriteria(typeof(DomainObjectType)) в сеансе для объекта домена, который вы собираетесь извлечь из БД.

0 голосов
/ 19 марта 2009

Была похожая проблема, когда найти объект по идентификатору ... Все, что я сделал, это использовал полное имя в имени класса. То есть До этого было:

find("Class",id)

Объект, чтобы он стал таким:

find("assemblyName.Class",id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...