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