카테고리 보관물: C#

C#

NHibernate.MappingException : XYZ에 대한 지속 자 없음 <one-to-many

이제, 당신이 말을하기 전에 : 내가 했던 구글 내 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 , 여기 시나리오에 대한 해결책 은 다음과 같습니다. 코드를 변경했으며 런타임 중에 구성 파일에 어셈블리를 추가하지 않았습니다.



답변

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

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

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


답변

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

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


답변

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