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);

结果会是什么?NHibernate 是否loves_walkies因为对象是 a 而持久化该属性Dog,但看鉴别器说它是一只猫,所以它需要持久化该is_agile属性。

为了避免这种混淆,NHibernate 将鉴别器列设为只读。

之前有人问过这个问题,请参阅下面的链接以进一步阅读:

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

NHibernate - 改变子类型

于 2013-04-24T09:42:19.347 回答