nHibernate で奇妙な問題が発生しています...次の例外が発生しています:
Unable to resolve property: _Portal
オブジェクトグラフをコミットしようとしたとき。奇妙なことに、ソリューション全体を検索すると、この特定のプロパティがプロジェクト内のどこにもないように見えます。
この特定のケースに遭遇した人はいますか?もしそうなら、解決するために何をしましたか?
nHibernate で奇妙な問題が発生しています...次の例外が発生しています:
Unable to resolve property: _Portal
オブジェクトグラフをコミットしようとしたとき。奇妙なことに、ソリューション全体を検索すると、この特定のプロパティがプロジェクト内のどこにもないように見えます。
この特定のケースに遭遇した人はいますか?もしそうなら、解決するために何をしましたか?
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;
}
}
だから私は自分の問題を解決しましたが、なぜこれが解決策だったのかわかりません。
私のプロジェクトでは、nHibernate の使用を独自のプロジェクトに抽象化しました (*.Objects.nHibernate は名前空間です)。私がこれを行ったのは、私が使用しているクライアントが通常 nHibernate の使用を好まないためです。
何が起こっていたかというと、このプロジェクトには、システムにのみ追加されるデータ モデルがいくつかあるということです...たとえば、更新を行うことはありません。したがって、私の「リポジトリ」はそれを考慮に入れる必要があります。
リポジトリ内の Commit() 関数で、オブジェクト グラフをシリアライズしてからデシリアライズして、保存用のオブジェクトのコピーを作成します。私が行っていたのは、データベースに適切にコミットするために「_Session.SaveOrUpdate(...)」と言う必要があるときに、セッション「_Session.Merge(...)」と言っていた...理由がわからない違いはありましたが、それが過去 2 日間の答えでした。
どうも。あなたの助けのためにリッポ&ニコライ!
もう1つのアイデア。NHibernateを使用すると、マッピングでバッキングフィールドまたはプロパティにアクセスする方法を指定できます。たとえば<property access="nosetter.pascalcase-underscore" name="Timestamp" />
、NHibernateがフィールド_Timestampを介して値を設定するようにします。マッピングにそのようなアクセス指定子がありますか?
確認することはほとんどありません:-
portal
また、ソリューション内のどこかにWORDが存在しますか?HTH