136

さて、あなたがそれを言う前に: 私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 イベント、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(文字列エンティティ名、オブジェクト ID)
 c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1029 NHibernate.Impl.SessionImpl.Get (タイプ entityClass、オブジェクト 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 HQWebsite.LocalSearch.get_subCategory() 内
 C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:17 HQWebsite.LocalSearch.Page_Load(オブジェクト送信者、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(オブジェクト送信者、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 、私のシナリオの解決策は次のとおりです。一部のコードを変更し、実行時に構成ファイルにアセンブリを追加していませんでした。

4

18 に答える 18

102

マッピング アセンブリをセッション ファクトリ構成に追加するのを忘れたようです。

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>
.
.
于 2008-09-12T00:20:28.460 に答える
94

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

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

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

于 2009-11-25T10:09:45.923 に答える
45

私はここからこれを取りました:

私の場合、マッピングクラスは公開されていませんでした。言い換えれば、代わりに:

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

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

class UserMap : ClassMap<user>
于 2010-08-22T16:14:16.047 に答える
29

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

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

于 2012-08-01T11:27:02.440 に答える
4

同様の問題があり、次のように解決しました。

私は MS SQL 2008 で作業していますが、NH 構成では、NHibernate.Dialect という方言が正しくありませんでした。MsSql2005Dialect に修正すると、NHibernate.Dialect になります。MsSql2008Dialect を実行すると、"No persister for: ..." という例外が発生することなく、すべて正常に動作します。

于 2010-07-08T13:04:01.040 に答える
3

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

于 2012-06-28T21:09:50.713 に答える
3

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

于 2011-05-24T15:13:50.777 に答える
2

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

次に、非ジェネリック テストで試して、適切な型パラメーターを渡していることを確認します。

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

于 2008-09-11T23:01:31.490 に答える
2

Configuration.AddAssembly() メソッドに間違ったアセンブリを追加していたため、同じ問題が発生しました。

于 2010-12-27T10:54:28.163 に答える
2

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

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<YourEntityClassName>())
于 2014-04-18T11:59:46.077 に答える
1

別のアセンブリからリポジトリでテストを実行する場合は、Hibernate.cfg.xmlが常にそのアセンブリのbinディレクトリに出力されるように設定されていることを確認してください。これは私たちには起こらなかったし、特定の状況で上記のエラーが発生しました。

免責事項:これは、リポジトリ統合テストアセンブリの構造の直接的な結果であるため、少し難解なアドバイスになる可能性があります(つまり、各テストアセンブリから単一のHibernate.xfg.xmlへのシンボリックリンクがあります)

于 2009-03-05T15:04:17.217 に答える
0

IDでオブジェクトを見つけるときに同様の問題がありました...私がしたことは、クラス名に完全修飾名を使用することだけでした。それはそれがあった前です:

find("Class",id)

オブジェクトなので、次のようになりました:

find("assemblyName.Class",id)
于 2009-03-18T21:05:41.053 に答える
0

CreateCriteria(typeof(DomainObjectType))DB から取得するドメイン オブジェクトの Session でメソッドを呼び出したことを確認してください。

于 2011-09-09T10:05:29.620 に答える