2013-04-24 35 views
1

我有一個鑑別器列,我需要使用選擇插入和更新。我需要更新並選擇員工類型。我在映射xml文件中有以下代碼。Discriminator列nhibernate

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

請幫助我

+0

你的問題是什麼呢? (除了事實update =「false」將阻止更新,動態地改變鑑別值可能會在你的代碼中引入類型不一致) – jbl 2013-04-24 07:21:46

+0

我的問題是EmployeeType列應該用於更新,插入和選擇... if我使用update =「false」insert =「false」,那麼它在select語句中適用於Employeetype,但不適用於更新或插入。但是當我使用update =「true」或insert =「true」...它不適用於甚至選擇語句...我需要有EmployeeType鑑別器列來選擇/插入/更新 – Ram 2013-04-24 07:48:08

+0

您發佈的映射看起來很好。我猜你錯過了你的類和子類映射的鑑別值屬性鑑別值的值將在插入時自動設置,並且更新(這將引入不一致)將不被允許。 – jbl 2013-04-24 08:06:46

回答

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屬性,因爲對象是Dog,但看起來鑑別器說它是一個貓,所以它需要保留is_agile屬性。

爲了避免這種混淆,NHibernate使鑑別器列爲只讀。

這個問題已經被問過,請參閱下面的進一步閱讀鏈接:

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

NHibernate - Changing sub-types