2009-02-09 150 views
2

我在NHibernate中有一個場景,我在實體Employee和EmployeeStatus之間有一對多的關係。NHibernate單向,一對多映射問題

員工具有屬性,例如:ID,名稱和EmployeeStatus的IList,而對於此問題,EmployeeStatus只具有自己的ID和一些自由文本。

我不需要從EmployeeStatus持有對Employee的引用,狀態管理將完全通過Employee實體完成 - 添加到IList屬性中。 IE:我想完全可以做到以下幾點:

Employee e = new Employee(); 
e.Name = "Tony"; 
e.StatusList.Add(new EmployeeStatus("Status A")); 
e.StatusList.Add(new EmployeeStatus("Status B")); 
session.Save(e); 

我已經試過各種方法,包括創建單向一個一對多的映射,其中逆是假的,級聯設置爲全刪除,孤兒,而這一切看起來像它應該工作,但它產生關於無法在EmployeeStatus中設置EmployeeId的例外。我被引導認爲這是因爲NHibernate想要使用EmployeeId作爲NULL的插入,然後將其更新爲父項的ID。

我想我錯過了這裏的東西,很簡單 - 任何人都可以告訴我什麼我的映射文件應該看起來像實現上述?

在此先感謝

託尼

- 編輯:繼承人的要求類的一個粗略的想法 -

public class Employee 
{ 
    private IList<EmployeeStatus> _statusList; 

    public Employee() 
    { 
    _statusList = new List<EmployeeStatus>(); 
    } 

    public virtual int Id{ get; set; } 

    public virtual string Name{ get; set; } 

    public virtual IList<EmployeeStatus> StatusList 
    { 
    get 
    { 
     return _statusList; 
    } 
    } 
} 

public class EmployeeStatus 
{ 
    public virtual int Id{ get; set; } 
    public virtual string StatusText{ get; set; } 

    public EmployeeStatus() 
    { 
    } 

    public EmployeeStatus(string statusText) 
    { 
    StatusText = statusText; 
    } 
} 

回答

-1

你能張貼類的代碼?

您是否試圖保留員工的狀態歷史記錄?

- 編輯 -
看起來您將需要多對多,因爲關係中的子女(EmployeeStatus)沒有引用回父母(Employee)。

- 編輯2 -
如果要將插入操作完成爲1調用DB,則需要將Employee屬性添加到EmployeeStatus類,並設置Inverse = true。我很確定你將需要添加一些邏輯來設置對象中的雙向關係。 I.E.

public void AddStatus(EmployeeStatus status) 
{ 
    this.StatusList.Add(status); 
    status.Employee = this; 
} 
+0

它是一個更復雜的領域模型的一部分,但這是我一直無法工作的唯一部分,所以我已經簡化並將整個事件簡化到上面。謝謝。 – 2009-02-09 18:23:12

+0

我可能沒有在那裏清楚解釋,但員工身份不能與多個員工關聯。它肯定是1(僱員)對許多(狀態').... – 2009-02-09 18:36:36

0

我可能沒有解釋清楚,但員工狀態不能鏈接到多個員工。這絕對是1(員工)對許多(狀態')

在物理數據庫中,狀態實體有一個employeeID字段,它不在域中 - IE:我不持有從狀態實體,但物理字段應該從集合的所有者中推斷 - 事實上,如果我將狀態表中的EmployeeID字段設置爲可空 - 它實際上執行2條SQL語句 - 插入和更新,在更新中設置EmployeeID。

感謝,

託尼

0

原來,是我想做的事情是不可能的 - 你必須有一個雙向關聯,並且必須將孩子的家長參考。我想這不是一個大問題,但不想讓孩子在我的代碼中直接不需要引用。

2

您描述的場景只是一個基本的一對多映射。這裏是功能NHibernate映射這樣的:

public class EmployeeMap : ClassMap<Employee> 
{ 
    public EmployeeMap() 
    { 
     WithTable("Employee"); 
     HasMany(employee => employee.StatusList) 
     .Cascade.All(); 
    } 
} 

你並不需要維持從一個的employeeStatus參考回到員工來實現這一目標。