1

私は nhibernate 3 を使用しており、以下のようなコードでマッピングしています:

public class PubCalcInvokesMap : ClassMapping<PubCalcInvokes> {
    public PubCalcInvokesMap() {
        Table("PUB_CALC_INVOKES");
        Schema("dbo");
        Lazy(true);
        Id(x => x.CinId, map => { map.Column("CIN_ID"); map.Generator(Generators.Assigned); });
        Property(x => x.CinCltId, map => map.Column("CIN_CLT_ID"));
        Property(x => x.CinInvokeDate, map => { map.Column("CIN_INVOKE_DATE"); map.NotNullable(true); });
        Property(x => x.CinLogin, map => { map.Column("CIN_LOGIN"); map.NotNullable(true); });
        Property(x => x.CinUserGroup, map => { map.Column("CIN_USER_GROUP"); map.NotNullable(true); });
        Property(x => x.CinDateFrom, map => map.Column("CIN_DATE_FROM"));
        Property(x => x.CinDateTo, map => map.Column("CIN_DATE_TO"));
        Property(x => x.CinStatus, map => { map.Column("CIN_STATUS"); map.NotNullable(true); });
        Property(x => x.CinClcPayCb, map => { map.Column("CIN_CLC_PAY_CB"); map.NotNullable(true); });
        Property(x => x.CinClcPayIfId, map => map.Column("CIN_CLC_PAY_IF_ID"));
        Property(x => x.CinClcCompetenceLevel, map => map.Column("CIN_CLC_COMPETENCE_LEVEL"));
        ManyToOne(x => x.PubEvPepPriceList, map => 
        {
            map.Column("CIN_CLC_EVO_PPL_ID");
            map.Cascade(Cascade.None);
        });

        Bag(x => x.PubCalcEvPlDetails, colmap => { colmap.Key(x => x.Column("CED_CIN_ID")); colmap.Inverse(false); colmap.Cascade(Cascade.All); }, map => { map.OneToMany(); });
        Bag(x => x.PubCalcInvokeDetails, colmap => { colmap.Key(x => x.Column("CID_CIN_ID")); colmap.Inverse(false); colmap.Cascade(Cascade.All); }, map => { map.OneToMany(); });
        Bag(x => x.PubCalcMscPlFactors, colmap => { colmap.Key(x => x.Column("CMF_CIN_ID")); colmap.Inverse(false); colmap.Cascade(Cascade.All | Cascade.DeleteOrphans); }, map => { map.OneToMany(); });
    }
}
public class PubCalcMscPlFactorsMap : ClassMapping<PubCalcMscPlFactors> {
    public PubCalcMscPlFactorsMap() {
        Table("PUB_CALC_MSC_PL_FACTORS");
        Schema("dbo");
        Lazy(true);
        Id(x => x.CmfId, map => { map.Column("CMF_ID"); map.Generator(Generators.Identity); });
        Property(x => x.CmfFactorPerc, map => { map.Column("CMF_FACTOR_PERC"); map.NotNullable(true); });
        Property(x => x.CmfFactorFixed, map => { map.Column("CMF_FACTOR_FIXED"); map.NotNullable(true); });
        Property(x => x.CmfFactorIfcsPerc, map => { map.Column("CMF_FACTOR_IFCS_PERC"); map.NotNullable(true); });
        Property(x => x.CmfFactorFloor, map => { map.Column("CMF_FACTOR_FLOOR"); map.NotNullable(true); });
        Property(x => x.CmfFactorCbrebate, map => { map.Column("CMF_FACTOR_CBREBATE"); map.NotNullable(true); });
        ManyToOne(x => x.PubCalcInvokes, map => 
        {
            map.Column("CMF_CIN_ID");
            map.Cascade(Cascade.None);
        });

        ManyToOne(x => x.PubMscPlTypesDict, map => { map.Column("CMF_PTD_ID"); map.Cascade(Cascade.None); });

        Bag(x => x.PubCalcPayResults, colmap =>  { colmap.Key(x => x.Column("CPR_CMF_ID")); colmap.Inverse(true); }, map => { map.OneToMany(); });
    }
}

これが私の簡単なコードです:

PubCalcInvokes invoke = this._session.QueryOver<PubCalcInvokes>()
    .Where(x => x.CinId == cinID)
    .SingleOrDefault();
invoke.PubCalcMscPlFactors.Clear();
tran = this._session.BeginTransaction();
this._session.Merge(invoke);
tran.Commit();

いくつか質問があります:

  1. nhibernate がこのコードを次のような SQL クエリに変換する理由 (正確な順序で):
    • UPDATE は PubCalcMscPlFactors をクリアし、PubCalcInvokes への NULL FK に設定します
    • UPDATE は PubCalcMscPlFactors をクリアし、FK を PubCalcInvokes に設定します。WHERE 条件では、PubCalcMscPlFactors からの PK を使用しています。
    • DELETE クリアされた PubCalcMscPlFactors コレクション
  2. この動作を変更して DELETE のみを実行することは可能ですか?
4

1 に答える 1

1

不適切なマッピング。PubCalcInvokesMap で PubCalcMscPlFactors の逆を true に設定すると、すべて正常に動作します。

于 2014-03-04T08:05:16.930 に答える