NHibernate.MappingException : XYZ에 대한 지속 자 없음


134

이제, 당신이 말을하기 전에 : 내가 했던 구글 내 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 : 지속 기 없음 : HQData.Objects.SubCategory] NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName, Boolean throwIfNotFound)
 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.DefaultLoadEventListener.OnLoad (LoadEvent 이벤트, LoadType loadType)
 c : \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Event \ Default \ DefaultLoadEventListener.cs : 37 NHibernate.Impl.SessionImpl.FireLoad (LoadEvent 이벤트, LoadType loadType)
 c : \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs : 2054 NHibernate.Impl.SessionImpl.Get (문자열 entityName, 개체 ID)
 c : \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs : 1029 NHibernate.Impl.SessionImpl.Get에서 (Type entityClass, Object id)
 c : \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs : 1020 NHibernate.Impl.SessionImpl.Get (개체 ID)
 c : \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs : 985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject (Int32 Id)
 C : \ Development \ HQChannelRepo \ HQ Channel Application \ HQChannel \ HQData \ DataAccessUtils \ NHibernateObjectHelper.cs : 42에서 HQ Website.LocalSearch.get_subCategory ()
 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.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 (부울 includeStagesBeforeAsyncPoint, 부울 includeStagesAfterAsyncPoint) +1436

Update , 여기 시나리오에 대한 해결책 은 다음과 같습니다. 코드를 변경했으며 런타임 중에 구성 파일에 어셈블리를 추가하지 않았습니다.


나는 같은 오류가 있었지만 다른 문제가있었습니다. SearchItem가 매핑 오류, 만일 Session.load <SearchItem> (searchItemID)를 반환으로 만일 Session.load ( "SearchItem", searchItemID)는하지 않습니다 (어쨌든 그 일을 덜 오류가 발생하기 쉬운 방법입니다.
켄드릭

답변:


101

세션 팩토리 구성에 맵핑 어셈블리를 추가하지 않은 것 같습니다.

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>
.
.

7
Fluent NHibernate 에서이 작업을 수행하는 방법, 나는 별도의 프로젝트에서 패턴을 개발 중이므로 사용자 어셈블리에 액세스 할 수 없습니까?
Mustafa Magdy

사용자 어셈블리를 참조 할 수 없다면 Fluent NHibernate를 사용할 수 없다고 생각합니다.
Andy S

91

NHibernate를 처음 접하는 사람에게는 분명하지만 매우 유용한 정보입니다.

모든 XML 맵핑 파일은 기본 컨텐츠가 아닌 임베드 된 자원 으로 처리되어야합니다. . 이 옵션은 파일 속성에서 빌드 조치 속성을 편집하여 설정됩니다.

그런 다음 XML 파일이 어셈블리에 임베드되고 NHibernate의 구성 단계 동안 프로젝트 시작시 구문 분석됩니다.


1
Haleluia, 나는 그것을 가지고 Embedded resource있지만 한 컴퓨터에서 다른 컴퓨터로 복사 할 때 파일은이 속성을 잃어 버렸습니다. 나는 몇 분 동안 머리를 긁었다.
Dragos Durlut 2016 년

1
@DragosDurlut 파일 자체가 아니라 프로젝트 파일 정보를 저장하는 프로젝트 파일 (.csproj)입니다.
Wagner Leonardi

50

내 문제는 매핑 XML의 이름에 .hbm을 넣는 것을 잊었다는 것입니다. 또한 포함 된 리소스로 만들어야합니다!


1
저도 실수였습니다!
Gringo

이것은 또한 내 문제였습니다 .get을 할 때 Q와 같은 오류가 발생합니다. 해당 유형의 모든 객체를 쿼리하려고 할 때 오류가 없으며 빈 결과 집합 만 있습니다!
Christoph

Arg-. hbm도 잊어 버렸습니다. 감사!
Dr. C. Hilarius

42

나는 이것을 여기서 꺼냈다 .

필자의 경우 매핑 클래스는 공개되지 않았습니다. 다시 말해,

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

나는 방금했다 :

class UserMap : ClassMap<user>

고마워, 당신은 약간의 두통에서 나를 구했다. :)
Rytmis

2
Fluent를 사용하는 경우 이것이 더 일반적인 원인이라고 생각합니다. 고마워, 그것은 놓치기 매우 쉬웠다.
Richard Neil Ilagan

1
감사! 매핑 클래스를 공개했는지 여부를 확인하기 위해이 엔티티에 대한 매핑 클래스를 작성하지 않았다는 것을 알았습니다. :) 시간을 절약 해주었습니다 !!
Jen

28

에 4시간에 대한 지출 인터넷 검색stackoverflowing 주변의 모든 것을 시도해 보았습니다. 내 오류가 발견되었습니다.

내 매핑 파일이 호출되었습니다 .hbm.xml 대신 .nbm.xml 했습니다 . 미쳤다.


9
Argh, 방금 .hbm.xml 대신 .xml로 사용한다는 점을 제외하고는 똑같이했습니다. 어쩌면 오류에 대한 힌트가있을 것입니다 :)
Rezler

2
omg. 나는 내가 이것을했다고 믿을 수 없다. 나는 파일 매핑에서 오류를 찾기 위해 몇 시간을 찾고 있었고 파일 이름에 오타가있는 것으로 판명되었습니다 ... doh. 감사합니다! 나는 이것을 우연히 발견하지 않으면 머리가 얼마나 오래 찢어 졌을 지 생각하고 떨었습니다.
kamui

1
와우, 큰 캐치-나는이 문제에 머리를 뽑고 있었다. 내 xml 파일을 백 번 살펴 보았는데 왜 다른 파일처럼 작동하지 않는지 알 수 없었습니다. 실제로 파일 이름의 ".hbm"부분이 누락되었습니다. 감사!
Winger

당신은 내 시간을 절약했습니다. 감사합니다
Manjay_TBAG

4

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

MS SQL 2008에서 일했지만 NH 구성에서 NHibernate.Dialect와 같은 나쁜 방언을 사용했습니다. 수정 하면 NHibernate.Dialect입니다. MsSql2008Dialect 그러면 "No persister for ::"David 예외없이 모든 것이 제대로 작동합니다.


3

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


3

Amol의 답변에 추가하기 위해 인터페이스 클래스 유형을 잘못 지정하지 마십시오. 구현 클래스를 지정했는지 확인하십시오 . (즉, IDomainObjectType을 사용하지 마십시오). 내가이 실수를하지 않았다 ... :)


2

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

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

전체 오류 메시지를 게시 할 수 있습니까?


2

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


2

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

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

고마워 친구! 내 단체가 앉아 있던 프로젝트를 전환했습니다!
viggity

1

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

면책 조항 : 우리가 저장소 통합 테스트 어셈블리를 구성하는 방법의 직접적인 결과 (즉, 각 테스트 어셈블리에서 단일 Hibernate.xfg.xml 로의 심볼릭 링크가 있음)를 감안할 때 약간 난해한 조언 일 수 있습니다.


1

.config 파일에 매핑 정보를 지정하는 것을 잊지 마십시오

예 :

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


0

id로 객체를 찾을 때 비슷한 문제가 발생했습니다 ... 클래스 이름에 정규화 된 이름을 사용하는 것이 전부였습니다. 그 전에는 :

find("Class",id)

객체가 다음과 같이되었습니다.

find("assemblyName.Class",id)

0

CreateCriteria(typeof(DomainObjectType))DB에서 페치하려는 도메인 오브젝트에 대해 세션 에서 메소드를 호출했는지 확인하십시오 .


이것은 페치가 아닌 지속입니다.
Joshua Drake

0

비슷한 문제가 있지만 언급 된 모든 요구 사항 이 충족됩니다. 필자의 경우 일부 엔티티 클래스 (OBJEKTE 유형)를 DB에 다시 저장하려고합니다. 다른 장소는 작동하지만이 경우에만 실패 하고이 예외가 발생합니다.

내 솔루션 (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 저장소 자체라는 것입니다. 어쨌든 나는 다음에이 재 할당 핵을 유지한다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.