4

nHibernate で奇妙な問題が発生しています...次の例外が発生しています:

Unable to resolve property: _Portal

オブジェクトグラフをコミットしようとしたとき。奇妙なことに、ソリューション全体を検索すると、この特定のプロパティがプロジェクト内のどこにもないように見えます。

この特定のケースに遭遇した人はいますか?もしそうなら、解決するために何をしましたか?

4

5 に答える 5

6

nHibernateを3.3(3.1から)にアップグレードした後、関連するライブラリ(FluentNhibernateを含む)と同じ問題が発生しました。子コレクションを持つ親オブジェクトがあり、子コレクションを変更すると、受け取ったのと同じ例外がスローされます(存在しない「_Namespace」プロパティ名で、「Namespace」は実際の名前空間の最初のセクションでした)。

この場合、SaveOrUpdate()に切り替えることはオプションではありません。実際には、このオブジェクトのバージョンもセッションにロードされているため、Merge()が必要です。

他にどのような類似点があるのか​​わかりません。私たちにとっては、FluentNhibernateを使用した子コレクションを持つ親オブジェクトです。親オブジェクトへのマッピングは、子の場合はCascade.AllDeleteOrphan()であり、子から親へのマッピングはCascade.None()です。

残念ながら、このバグに関する他のレポートは見つかりませんでした。そのため、解決策はnHibernate 3.1(およびFluentNhibernateやIesi.Collectionsなどの関連するバイナリ)に戻すことでした。それが唯一の変更であり、それから再び正常に動作します。

JIRA[3234]に記録されたバグの更新。

これについてJIRAに記録されたバグがあります。この問題はまだ優先されていません。おそらく、この問題が発生している場合は、アカウントを作成して、修正するバグに投票することができます。 https://nhibernate.jira.com/browse/NH-3234

バグJIRA[3234]に対して投稿された回避策の更新。

バグに関するOndrejのコメントによると、セッション構成のデフォルトのマージリスナーをこのコードでオーバーライドすると、今のところ問題が解決します。回避策が掲載されているので、まもなく正式に修正されると確信しています。

public class UniDirectionalMergeFixListener : DefaultMergeEventListener
{
    protected override IDictionary GetMergeMap(object anything)
    {
        var cache = (EventCache)anything;
        var result = IdentityMap.Instantiate(cache.Count);

        foreach (DictionaryEntry entry in cache)
            result[entry.Value] = entry.Key;

        return result;
    }
}
于 2012-05-08T15:59:51.047 に答える
1

だから私は自分の問題を解決しましたが、なぜこれが解決策だったのかわかりません。

私のプロジェクトでは、nHibernate の使用を独自のプロジェクトに抽象化しました (*.Objects.nHibernate は名前空間です)。私がこれを行ったのは、私が使用しているクライアントが通常 nHibernate の使用を好まないためです。

何が起こっていたかというと、このプロジェクトには、システムにのみ追加されるデータ モデルがいくつかあるということです...たとえば、更新を行うことはありません。したがって、私の「リポジトリ」はそれを考慮に入れる必要があります。

リポジトリ内の Commit() 関数で、オブジェクト グラフをシリアライズしてからデシリアライズして、保存用のオブジェクトのコピーを作成します。私が行っていたのは、データベースに適切にコミットするために「_Session.SaveOrUpdate(...)」と言う必要があるときに、セッション「_Session.Merge(...)」と言っていた...理由がわからない違いはありましたが、それが過去 2 日間の答えでした。

どうも。あなたの助けのためにリッポ&ニコライ!

于 2012-05-07T15:24:33.063 に答える
0

もう1つのアイデア。NHibernateを使用すると、マッピングでバッキングフィールドまたはプロパティにアクセスする方法を指定できます。たとえば<property access="nosetter.pascalcase-underscore" name="Timestamp" />、NHibernateがフィールド_Timestampを介して値を設定するようにします。マッピングにそのようなアクセス指定子がありますか?

于 2012-05-05T09:11:26.503 に答える
0

確認することはほとんどありません:-

  1. ドメインに _Portal というバッキング フィールドがありますか?
  2. portalまた、ソリューション内のどこかにWORDが存在しますか?
  3. クリーンなソリューションを実行して、BIN フォルダーに残っている DLL を確認します。
  4. NHibernate 構成は、ビルド後にシリアライズされていますか? その場合は、最新バージョンを使用していることを確認してください。

HTH

于 2012-05-05T08:30:35.113 に答える