挿入と更新の選択に使用する必要がある識別子列があります。従業員タイプを更新して選択する必要があります。マッピング xml ファイルに次のコードがあります。
<discriminator column="EmployeeType" type="String"/>
<property name="EmployeeType" column="EmployeeType" update="false" insert="false" type="String" />
助けてください
挿入と更新の選択に使用する必要がある識別子列があります。従業員タイプを更新して選択する必要があります。マッピング xml ファイルに次のコードがあります。
<discriminator column="EmployeeType" type="String"/>
<property name="EmployeeType" column="EmployeeType" update="false" insert="false" type="String" />
助けてください
識別子の値を変更するとクラス タイプが変更されるため、やりたいことを実行することはできません。
可能な唯一の解決策は次のとおりです。
必要なクラスの新しいインスタンスを作成し、他のクラス インスタンスから値をコピーします。
型情報を格納するために継承と識別子を使用しないでください。代わりに列挙型プロパティを使用してください。これにより、その場で従業員のタイプを変更できます。
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