4

私は既存の*.hbm.xmlファイルを流暢なClassMapsに更新している最中であり、マッピングファイルの間違いに遭遇しました。これを正しくマッピングするためのデフォルトの動作がわかりません。

マッピングファイルには次のものがあります。

<one-to-one name="LineItemAssembly" 
            class="LineItemAssembly" 
            cascade="all-delete-orphan" />

Fluentを使用する場合、これは次のようにマップされると思います。

HasOne<LineItemAssembly>(x => x.LineItemAssembly)
                        .Cascade.AllDeleteOrphan();

ただし、AllDeleteOrphan()はCascadeのオプションではありません(正しくはそうです)。これはオプションではなく、マッピングファイルのエラーであるためだと理解しています。Fluentを使用した同等のマッピングで、Fluentマッピングが.hbm.xmlファイルとまったく同じ機能を持つようにするにはどうすればよいですか?カスケードをFluentマッピングから除外するだけがデフォルトの動作になると思いますが、はっきりとはわかりません。

4

3 に答える 3

4

これは NHibernate 4.1 でサポートされるようになりました。1 対 1 の関係シップ カスケード「all-delete-orphan」が適切にサポートされるようになりました (問題NH-1262は 4.1 で修正されています)。私はそれをテストし、それが機能していることを確認できます-子の1対1のプロパティをnullに設定すると、子に対してsql deleteコマンドが発行されます。

残念ながら、流暢な nhibernate は 2015 年に最後に更新されたため、サポートしていません。ただし、流暢な nhibernate はソース コードから自分で構築できます ( https://github.com/jagregory/fluent-nhibernate流暢な NHibernate の構築方法? ; 私はこれに少し苦労しました - ruby​​、rubygems をインストールし、InstallGems.bat を実行し、手動で "bundle install" を実行し (何らかの理由で実行されませんでした)、"rake" コマンドを使用してソリューションをビルドする必要があります)。

次に、メソッドAllDeleteOrphanCollectionCascadeExpressionクラスからクラスに移動CascadeExpressionしてビルドするだけです (FluentNHibernate.sln を開いて Visual Studio 2010 以降を使用してビルドすることもできますが、「rake」コマンドを少なくとも 1 回実行する必要があります)。

ここに画像の説明を入力

HasOne AllDeleteOrphan サポートを備えた (私による) カスタムビルドの FluentNHibernate.dll バージョン 2.0.3.1 は、 ここからダウンロードできます。

于 2017-05-17T13:37:17.150 に答える
2

定義上、両方のレコードが存在する必要があります。削除は常に 1:1 でカスケードされます。XML マップがそれを許可した理由がわかりません。

于 2012-12-13T18:16:09.620 に答える
1

結局、デフォルトの流暢な動作に関係なく、何が間違っていたのかを突き止め、これを修正する必要がありました。http://brunoreis.com/tech/fluent-nhibernate-hasone-how-implement-one-to-one-relationship/の助けを借りて、この問題を解決できました。

.Cascade.All() を追加する必要がありました。しかし、私が本当に必要としていたのは、LineItemAssembly クラスのマッピングで、HasOne 関係から外れた .ForeignKey() でした。

于 2012-12-13T20:06:04.980 に答える