1

従業員が獲得した計算されたボーナスとポイントを保存するEmployeeMonthオブジェクトがあります。EmployeeMonthオブジェクトには、BonusMonthオブジェクトがあります。BonusMonthオブジェクトは、ボーナスを獲得するために従業員が毎月到達しなければならない間隔を設定します(このオブジェクトは毎月設定され、変更しないでください)。

たとえば88%の削減でボーナスを再計算する場合、BonusMonthオブジェクトの間隔を調整してから、ボーナスを再計算します。新しいボーナス(結果)は、同じEmployeeMonthオブジェクトに保存されます。

次に、新しいEmployeeMonthを保存すると、BonusMonthも同様に保存されます。

BonusMonthが保存されないようにnhibernateマッピングを構成するにはどうすればよいですか?再計算されたEmployeeMonth値のみを更新/保存したい。

これは私のマッピングがどのように見えるかです:

EmployeeMonth.cs

public class EmployeeMonth
{
    public virtual Guid Id { get; private set; }
    public virtual BonusMonth BonusMonth { get; set; }
    public virtual Employee Employee { get; set; }
    public virtual int WorkReductionPercent { get; set; }
    public virtual int Points { get; set; }
    public virtual decimal Bonus{ get; set; }
}

BonusMonth.cs

public class BonusMonth
{
    public virtual int BasicPoints { get; set; }
    public virtual int ExtraPoints { get; set; }
    public virtual int MaxPoints { get; set; }

    public virtual decimal BasicBonus { get; set; }
    public virtual decimal ExtraBonus { get; set; }
    public virtual decimal MaxBonus { get; set; }
}

EmployeeMonth.hbm.xml

<class name="EmployeeMonth">
    <id name="Id">
        <generator class="guid" />
    </id>

    <property name="WorkReductionPercent"/>
    <property name="Points"/>
    <property name="Bonus"/>

    <many-to-one name="Employee" unique-key="EpId" column="EmployeeId" cascade="none" not-null="true" insert="true" update="false" />
    <many-to-one name="BonusMonth" column="BonusMonthId" cascade="none" not-null="true" insert="true" update="false" />
</class>

BonusMonth.hbm.xml

<class name="BonusMonth">
    <id name="Id">
        <generator class="guid" />
    </id>
    <property name="BasicPoints"/>
    <property name="ExtraPoints"/>
    <property name="MaxPoints"/>
    <property name="BasicBonus"/>
    <property name="ExtraBonus"/>
    <property name="MaxBonus"/>
</class>
4

1 に答える 1

0

カスケードとは何の関係もありません。BonusMonthエンティティがNHibernateセッションに関連付けられているためです。変更をデータベースに保持したい場合を除いて、個人的にはBonusMonthエンティティを変更しないことをお勧めしますが、主張する場合は、BonusMonthエンティティをセッションから切り離すことで問題を回避できます。

session.Evict(employeeMonth.BonusMonth)

それでもcascade="none"が必要です。そうしないと、employeeMonthを保存するときにエンティティが再アタッチされるだけです。

于 2013-02-13T13:03:22.697 に答える