문제

I'm using nhibernate 3 and mapping by code like below:

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(); });
    }
}

Here is my simple code:

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();

I have few questions:

  1. Why nhibernate translating this code to SQL queries like this (in exact order):
    • UPDATE cleared PubCalcMscPlFactors and set to NULL FK to PubCalcInvokes
    • UPDATE cleared PubCalcMscPlFactors and set FK to PubCalcInvokes, in WHERE condition it's using PK from PubCalcMscPlFactors
    • DELETE cleared PubCalcMscPlFactors collection
  2. Is it possible to change this behaviour to do only DELETE?
도움이 되었습니까?

해결책

Bad mapping. After setting inverse on PubCalcMscPlFactors to true in PubCalcInvokesMap everything works fine.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top