NHibernate.MappingException:持続性なし:XYZ


134

さて、あなたが言う前に:私 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:パーシスターなし: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 event、LoadType loadType)
 c:\ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Event \ Default \ DefaultLoadEventListener.cs:37 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event、LoadType loadType)
 c:\ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs:2054 NHibernate.Impl.SessionImpl.Get(String entityName、Object 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(Object 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 HQWebsite.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(Boolean includeStagesBeforeAsyncPoint、Boolean includeStagesAfterAsyncPoint)+1436

更新、これが私のシナリオの解決策でした:いくつかのコードを変更しましたが、実行時にアセンブリを構成ファイルに追加していませんでした。


私は同じエラーがありましたが、別の問題がありました。たSession.load( "SearchItem"、searchItemID)SearchItemは、マッピングエラーを返すよう、た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でこれを行う方法、私はserperateプロジェクトでパターンを開発しているため、ユーザーアセンブリにアクセスできません。
Mustafa Magdy

ユーザーアセンブリを参照できない場合、Fluent NHibernateを使用することはできないと思います。
アンディS

91

明らかなものですが、NHibernateを初めて使う人にとっては非常に便利です。

すべてのXMLマッピングファイルは、デフォルトのコンテンツではなく埋め込みリソースとして扱う必要があります。このオプションは、ファイルのプロパティのビルドアクション属性を編集して設定します。

次に、XMLファイルはアセンブリに埋め込まれ、NHibernateの構成フェーズ中のプロジェクトの起動時に解析されます。


1
Haleluia、私はそれをとして持っていEmbedded resourceますが、あるコンピューターから別のコンピューターにコピーすると、ファイルはこのプロパティを失いました。数分間頭を掻いた。
Dragos Durlut

1
@DragosDurlutファイル自体ではなく、プロジェクトファイルの情報を保存するプロジェクトファイル(.csproj)。
ワグナーレオナルディ2014

50

私の問題は、マッピングxmlの名前に.hbmを入れるのを忘れていたことでした。また、それを埋め込みリソースにしてください!


1
それも私の間違いでした!
グリンゴ2014

これも私の問題でした。getを実行すると、Qと同じエラーが発生します。そのタイプのすべてのオブジェクトをクエリしようとしても、エラーは発生せず、空の結果セットだけです!
クリストフ

Arg-.hbmも忘れました。ありがとう!
C.ヒラリウス博士

42

ここから降り

私の場合、マッピングクラスはパブリックではありませんでした。つまり、次の代わりに:

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

私はちょうど持っていました:

class UserMap : ClassMap<user>

ありがとう、あなたは私を少しの頭痛の種から救いました。:)
Rytmis

2
Fluentを使用している場合、これがより一般的な原因になると思います。ありがとう、それは見逃すのが非常に簡単でした。
Richard Neil Ilagan

1
ありがとう!マッピングクラスを公開したかどうかを確認する際に、このエンティティのマッピングクラスを作成していないことがわかりました。:)時間の節約になりました!!
ジェン

28

グーグルスタックオーバーフローに約4時間費やして、そこにあるすべてのものを試しましたが、エラーが見つかりました:

私のマッピングファイルは、.hbm.xmlではなく.nbm.xmlと呼ばれていました。それは非常識でした。


9
ああ、私はそれを.hbm.xmlの代わりに.xmlとして持っていた以外は同じことをしました。多分エラーにいくつかのヒントがあるはずです:)
Rezler

2
ああ、神様。私がこれをしたとは信じられません。エラーのファイルをマッピングするために何時間も検索していたところ、ファイル名にタイプミスがあったことがわかりました... ありがとうございました!私はこれにつまずかなかったとしたら、どれだけ長く髪を引き裂いていたのかと考えると身震いします。
kamui 2013

1
うわー、すごいキャッチ-この問題で髪を抜いていた。私のxmlファイルを100回見ましたが、なぜ他のファイルと同じように機能していないのか理解できませんでした。実際には、ファイル名の ".hbm"の部分がありませんでした。ありがとう!
ウィンガー、2014

あなたは私の時間を節約しました。ありがとう
Manjay_TBAG

4

私は同様の問題があり、私はそれを次のように解決しました:

私はMS SQL 2008で作業していますが、NH構成では、悪い方言であるNHibernate.Dialectがありました。MsSql2005Dialect これを次のように修正した場合:NHibernate.Dialect。MsSql2008Dialect はすべて例外なく例外なく機能します。


3

また、初期化中に間違ったアセンブリを追加していました。私が永続化しているクラスはアセンブリ#1にあり、.hbm.xmlファイルはアセンブリ#2に埋め込まれています。cfg.AddAssembly(...(アセンブリ#1の代わりに)アセンブリ#2を追加するように変更し、すべてが機能しました。ありがとう!


3

Amolの答えに追加するために、インターフェイスクラスタイプの指定を間違えないでください。 必ず実装クラスを指定してください。(つまり、IDomainObjectTypeを使用しないでください)。私がこの間違いをしたわけではありません... :)


2

それでいいのname="Id"?タイプミスが原因である可能性があります。

次に、適切な型パラメーターを渡しているかどうかを確認するために、非ジェネリックテストを試してみます。

エラーメッセージ全体を投稿できますか?



2

このエラーは、無効なマッピング構成が原因で発生します。セッションファクトリの.Mappingsを設定した場所を確認する必要があります。基本的にプロジェクトで「.Mappings(」を検索し、以下の行で正しいエンティティークラスを指定したことを確認してください。

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

ありがとう、相棒!エンティティが座っていたプロジェクトを切り替えました!
活力

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からフェッチしようとしているドメインオブジェクトのSessionでメソッドを呼び出したことを確認してください。


これは永続化であり、フェッチではありません。
ジョシュアドレイク

0

私にも同様の問題がありますが、言及されたすべての要件は満たされています。私の場合、いくつかのエンティティークラス(Type of 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.