Question

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?
Was it helpful?

Solution

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top