Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 鉴别柱_Asp.net_Nhibernate - Fatal编程技术网

Asp.net 鉴别柱

Asp.net 鉴别柱,asp.net,nhibernate,Asp.net,Nhibernate,我在中有一个鉴别器列,需要用于选择插入和更新。我需要更新并选择员工类型。在映射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);
    
    var-dog=session.Get(guid);
    dog.AnimalType=“猫”;
    会话。保存或更新(狗);
    
    结果会怎样?NHibernate是否因为对象是
    狗而保留
    loves_walkies
    属性,但看,鉴别器说它是猫,所以它需要保留
    is agile
    属性

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

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


    你的问题到底是什么?(除了update=“false”会阻止更新,动态更改鉴别器值可能会导致代码中的类型不一致之外)我的问题是EmployeeType列应该用于更新、插入和选择…如果我使用update=“false”insert=“false”然后,对于select语句中的Employeetype,它可以正常工作,但对于update或insert则不行。但是,当我使用update=“true”或insert=“true”…它甚至不适用于select语句…我需要为select/insert/update设置EmployeeType鉴别器列您发布的映射看起来很好。我猜您错过了类和子类映射上的鉴别器值属性。鉴别器值将在插入时自动设置,并且不允许进行更新(这将导致不一致)。