2013-07-16 76 views
1

我們正在映射使用表,每個子類映射下列域對象:NHibernate的升級/降級從子類

class User { 
    Id; 
    FirstName; 
    LastName; 
    etc. 
} 

class Manager : User { 
    // manager specific properties 
} 

當在用戶界面中創建一個新的User我們檢查,看看是否Manager角色有已被選中並且必要時創建(並保存)Manager的實例而不是User

目標是儘可能簡單地轉換UserManager的過程(只需選擇一個角色)。

當我試圖通過去除Manager NHibernate的降級一個ManagerUser拋出異常,因爲它正試圖除去User記錄,以及(其具有在角色表約束)。

同樣,我不知道如何將用戶「升級」到Manager。由於我不能上演我猜我需要創建一個新的Manager實例與現有的User具有相同的身份?

我對Manager子映射可以在下面看到:

public class ManagerMap : SubclassMap<Manager> 
{ 
    public ManagerMap() 
    { 
     Table("Managers"); 
     KeyColumn("UserId"); 
     Map(n => n.EmploymentType); 
     Map(n => n.PriorityLevel); 
    } 
} 
+0

NHibernate將對象映射到/來自關係數據庫。你能改變內存中對象的類型嗎?不,因此NHibernate對此沒有任何規定。 –

回答

2

遺憾地說,這僅僅是不可能的。我試圖在幾年前做類似的事情,並詢問了一些人,看看他們是否知道,沉重的NHibernate用戶。結論是不可能的。

唯一的解決方案,我或任何我知道的人可以拿出來是使用直接SQL手動更新數據庫中的鑑別器。

假設用戶只能是1種類型。

即經理或員工,或培訓生。

我會給出一個允許用戶類型改變的下拉列表。所以這是一個與編輯用戶不同的過程。

這允許升級/降級用戶。使其成爲管理用戶的兩個步驟的缺點。

+0

您可能還需要記住將數據庫中不屬於管理員的任何列置零,並添加屬於用戶的列,但這可能與您的用例無關。 – Rippo

1

我認爲在這裏使用繼承來讓用戶成爲管理員是一個壞主意。用戶履行多種角色時會變得棘手。我會將一個可以爲空的ManagerBehaviour屬性添加到User類中,最終可能會轉而在用戶上擁有一堆Behavior對象。

+0

在我們的應用程序中,唯一具有任何額外行爲的角色是'Manager',並試圖將這些行爲概括爲行爲無疑會引入更多的複雜性。 –

+0

我認爲一個人的複雜性是另一個人的簡單性!國際海事組織的一位經理人員的財產比接受的解決方案更容易。 – mcintyre321

+0

也許,基於我發佈的簡化示例。但是,由於'Manager'與我們的域中的其他對象有許多一對多和一對一的關聯,因此很難將其轉化爲一般的東西。 –