我有一个鉴别器列,我需要将其用于选择插入和更新。我需要更新并选择员工类型。我在映射 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);
结果会是什么?NHibernate 是否loves_walkies
因为对象是 a 而持久化该属性Dog
,但看鉴别器说它是一只猫,所以它需要持久化该is_agile
属性。
为了避免这种混淆,NHibernate 将鉴别器列设为只读。
之前有人问过这个问题,请参阅下面的链接以进一步阅读:
https://groups.google.com/forum/?fromgroups=#!topic/nhusers/_Qqi4WCu2Bk