鉴别词列nhibernate

时间:2013-04-24 04:27:26

标签: asp.net nhibernate

我有一个鉴别器列,我需要使用它来进行选择插入和更新。我需要更新并选择Employee类型。我在映射xml文件中有以下代码。

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

请帮助我

1 个答案:

答案 0 :(得分:2)

不可能做你想做的事情,因为更改鉴别器值会改变类类型

唯一可行的解​​决方案是:

  1. 创建所需类的新实例,并从其他类实例复制值。

  2. 不要使用继承和鉴别器来存储类型信息。请改用枚举属性。这样您就可以动态更改员工的类型。

  3. 使用SQL Update语句更新鉴别器。

  4. 以下是对它没有意义的原因的一个例子。假设您有以下课程:

    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

    NHibernate - Changing sub-types