0

これは、私が以前に尋ねたこの質問に関連しています。

マッピングでは期限Requestに設定し、マッピングではカスケードをなしに設定しています。SaveUpdateDiscount

次の 2 つのシナリオがあります。

  1. 1 つ目は、新規リクエストと新規ディスカウントです。両方を作成し、割引をリクエストに追加してリクエストを保存しました。これは期待どおりに機能します。

  2. 次のシナリオは、新しいリクエストと既存の割引です。これは正しく機能していません。その理由はわかりません。以下は、テストで実行された SQL ステートメントです (値は省略します)。

    NHibernate: INSERT INTO Requests
    NHibernate: SELECT @@identity
    NHibernate: INSERT INTO DiscountRequests (DiscountId, RequestId) VALUES (3, 5);
    NHibernate: UPDATE Discounts
    NHibernate: DELETE FROM DiscountRequests WHERE DiscountId = 3;
    

最後の行が問題です。3 行目から戻って挿入を削除しています。Request オブジェクトに適用しているコマンドはsession.Save(request);、他には何もありません。

Delete の呼び出しが行われる理由はありますか?

編集:

コードの更新

 public void Add(Request request)
    {

        using (ISession session = NHibernateHelper.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Save(request);
                transaction.Commit();
            }
        }
    }

割引マッピング

<join table="DiscountRequests" optional="true">
  <key column="DiscountId" />
  <many-to-one name="Request" column="RequestId" cascade="none" />
</join>

リクエスト マッピング

<join table="DiscountRequests" optional="true">
    <key column="RequestId" />
    <many-to-one name="Discount" column="DiscountId" cascade="save-update" />
</join>

ttp://stackoverflow.com/questions/14837373/zero-to-one-relationship-nhibernate-mapping

4

1 に答える 1

0

以前の質問に対する受け入れられた回答に同意しません。結合マッピングの説明については、この記事を参照してください。

これを単純な多対多の関係 (または、DiscountRequest に追加データがある場合は 2 つの 1 対多) としてモデル化します。コレクションをフィールドとしてマップし、パブリック プロパティを介して割引のリクエストが 0 または 1 (およびその逆) であるというルールを適用できます。多対多の場合、カスケード設定はnone.

例えば:

public class Request
{
    private ICollection<Discount> _discounts;

    public Request() { _discounts = new Hashset<Discount>(); }

    public Discount
    {
        get { return _discounts.SingleOrDefault(); }
        set
        {
            _discounts.Clear();
            if (value != null) { _discounts.Add(value);
        }
     }
}
于 2013-02-25T16:00:45.103 に答える