문제

이제 말하기 전에:나 했다 구글과 나의 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

업데이트, 이에 대한 해결책은 다음과 같습니다. 나의 시나리오는 다음과 같습니다.일부 코드를 변경했는데 런타임 중에 구성 파일에 어셈블리를 추가하지 않았습니다.

도움이 되었습니까?

해결책

세션 팩토리 구성에 매핑 어셈블리를 추가하는 것을 잊은 것 같습니다.

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 매핑 파일은 다음과 같이 처리되어야 합니다. 내장된 리소스 기본값보다는 콘텐츠.이 옵션은 파일 속성에서 빌드 작업 속성을 편집하여 설정됩니다.

그런 다음 XML 파일은 어셈블리에 포함되고 NHibernate의 구성 단계 중 프로젝트 시작 시 구문 분석됩니다.

내 문제는 매핑 xml 이름에 .hbm을 넣는 것을 잊어버렸다는 것입니다.또한 임베디드 리소스로 만드십시오!

난 이걸 꺼냈어 여기:

제 경우에는 매핑 클래스가 공개되지 않았습니다.즉, 대신:

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

나는 방금 :

class UserMap : ClassMap<user>

약 4시간 정도 투자 인터넷 검색 그리고 스택오버플로우, 주변의 모든 것을 시도해 보았는데 오류를 발견했습니다.

내 매핑 파일이 호출되었습니다. .nbm.xml 대신에 .hbm.xml.그건 미친짓이었어.

비슷한 문제가 있었는데 다음과 같이 해결했습니다.

나는 MS SQL 2008에서 작업하고 있지만 NH 구성에서는 방언이 좋지 않았습니다.NHibernate.Dialect.MsSql2005Dialect내가 다음과 같이 수정한다면:NHibernate.Dialect.MsSql2008Dialect그러면 "다음에 대한 지속자가 없습니다." 예외 없이 모든 것이 잘 작동합니다.... "데이비드.

또한 초기화 중에 잘못된 어셈블리를 추가하고 있었습니다.내가 유지하고 있는 클래스는 어셈블리 #1에 있고 내 .hbm.xml 파일은 어셈블리 #2에 포함되어 있습니다.나는 변했다 cfg.AddAssembly(... 어셈블리 #1 대신 어셈블리 #2를 추가하면 모든 것이 작동합니다.감사해요!

Amol의 답변에 추가하려면 인터페이스 클래스 유형을 지정하는 실수를 저지르지 마십시오. 구현 클래스를 지정했는지 확인하세요..(즉.IDomainObjectType을 사용하지 마세요).내가 이런 실수를 한 것은 아니지만...:)

그럴까요? name="Id"?오타가 원인일 수 있습니다.

다음은 제네릭이 아닌 테스트를 통해 올바른 유형 매개변수를 전달하는지 확인하는 것입니다.

전체 오류 메시지를 게시할 수 있나요?

Configuration.AddAssembly() 메서드에 잘못된 어셈블리를 추가했기 때문에 동일한 문제가 발생했습니다.

이 오류는 잘못된 매핑 구성으로 인해 발생합니다.세션 팩토리에 대해 .Mappings를 설정한 위치를 확인해야 합니다.기본적으로 프로젝트에서 ".Mappings("를 검색하고 아래 줄에 올바른 엔터티 클래스를 지정했는지 확인하세요.

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

별도의 어셈블리에서 저장소에 대한 테스트를 실행하는 경우 Hibernate.cfg.xml이 해당 어셈블리의 bin 디렉토리에 항상 출력되도록 설정되어 있는지 확인하십시오.우리에게는 이런 일이 일어나지 않았으며 특정 상황에서 위의 오류가 발생했습니다.

부인 성명:이는 저장소 통합 테스트 어셈블리를 구성하는 방법의 직접적인 결과라는 점을 고려하면 약간 난해한 조언일 수 있습니다(예:우리는 각 테스트 어셈블리에서 단일 Hibernate.xfg.xml로의 심볼릭 링크를 가지고 있습니다)

.config 파일에 매핑 정보를 지정하는 것을 잊지 마세요.

예를 들어

MyApp.Data는 매핑이 포함된 어셈블리입니다.

ID로 개체를 찾을 때 비슷한 문제가 발생했습니다.내가 한 일은 클래스 이름에 정규화된 이름을 사용하는 것뿐이었습니다.그 전에는 다음과 같습니다.

find("Class",id)

개체는 다음과 같이 되었습니다.

find("assemblyName.Class",id)

전화를 걸었는지 확인하세요. CreateCriteria(typeof(DomainObjectType)) DB에서 가져오려는 도메인 개체에 대한 세션 메서드입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top