1

挿入と更新の選択に使用する必要がある識別子列があります。従業員タイプを更新して選択する必要があります。マッピング xml ファイルに次のコードがあります。

<discriminator column="EmployeeType" type="String"/>
<property name="EmployeeType" column="EmployeeType" update="false" insert="false"   type="String" />

助けてください

4

1 に答える 1

2

識別子の値を変更するとクラス タイプが変更されるため、やりたいことを実行することはできません。

可能な唯一の解決策は次のとおりです。

  1. 必要なクラスの新しいインスタンスを作成し、他のクラス インスタンスから値をコピーします。

  2. 型情報を格納するために継承と識別子を使用しないでください。代わりに列挙型プロパティを使用してください。これにより、その場で従業員のタイプを変更できます。

  3. SQL Update ステートメントを使用して識別子を更新します。

これが意味をなさない理由の例は次のとおりです。次のクラスがあるとします。

public abstract class Animal
{    
    public virtual Guid id { get; set; } 
    public virtual string AnimalType { get; set; }
    ...      
}

public class Dog : Animal
{
    public virtual bool loves_walkies { get; set; }
}

public class Cat : Animal
{
    public virtual bool is_agile { get; set; }
}

次のようなマッピングで

<class name="Earth.Animal">
    ...
    <discriminator column="AnimalType" type="String"/>
    <property name="AnimalType" type="String" />

    <subclass name="Earth.Cat" discriminator-value="Cat">
        <property name="loves_walkies" />
    </subclass>

    <subclass name="Earth.Dog" discriminator-value="Dog">
        <property name="is_agile" />
    </subclass>
</class>

NHibernate で次のようなことができるとします。

var dog = session.Get<Dog>(guid);
dog.AnimalType = "Cat";
session.SaveOrUpdate(dog);

結果はどうなるでしょうか?loves_walkiesオブジェクトが であるため、NHibernate はプロパティを永続化しますが、ディスクDogリミネータはそれが猫であると言うので、is_agileプロパティを永続化する必要があります。

この混乱を避けるために、NHibernate は識別子列を読み取り専用にします。

この質問は以前にもありました。詳細については、以下のリンクを参照してください。

https://groups.google.com/forum/?fromgroups=#!topic/nhusers/_Qqi4WCu2Bk

NHibernate - サブタイプの変更

于 2013-04-24T09:42:19.347 に答える