2014-03-03 83 views
1

我使用NHibernate 3和映射的代碼象下面這樣:NHibernate的映射,刪除和SQL查詢

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並設置爲NULL FK到PubCalcInvokes
    • UPDATE清除PubCalcMscPlFactors並設置FK到PubCalcInvokes,在WHERE條件它使用PK從PubCalcMscPlFactors
    • DELETE清除PubCalcMscPlFactors收集
  2. 是否有可能改變這種行爲只做DELETE?

回答

1

不良映射。將PubCalcMscPlFactors上的相反設置爲PubCalcInvokesMap中的true後,一切正常。