我有一个鉴别器列,我需要使用它来进行选择插入和更新。我需要更新并选择Employee类型。我在映射xml文件中有以下代码。
<discriminator column="EmployeeType" type="String"/>
<property name="EmployeeType" column="EmployeeType" update="false" insert="false" type="String" />
请帮助我
答案 0 :(得分:2)
不可能做你想做的事情,因为更改鉴别器值会改变类类型。
唯一可行的解决方案是:
创建所需类的新实例,并从其他类实例复制值。
不要使用继承和鉴别器来存储类型信息。请改用枚举属性。这样您就可以动态更改员工的类型。
使用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);
结果如何? NHibernate是否持久保存loves_walkies
属性,因为该对象是Dog
,但看看鉴别器是否它是猫,因此需要保留is_agile
属性。
为了避免这种混淆,NHibernate将鉴别器列设置为只读。
之前已经提出过这个问题,请参阅以下链接进一步阅读:
https://groups.google.com/forum/?fromgroups=#!topic/nhusers/_Qqi4WCu2Bk