2010-08-10 85 views
3

我不知道如何恰當地提出問題,所以提前抱歉。NHibernate實體和多個關聯

特別是使用FluentNHibernate,你將如何去做一些被許多其他表引用的表的實體?

例如員工實體。員工通常幾乎在任何地方都可以使用,一些程序讓他們的員工包含多個角色,多個任務或多個好處是有意義的。現在,我想象它是這樣的:

public class Employee 
{ 
    public virtual Employee() 
    { 
     Tasks = new List<Task>(); 
     Roles = new List<Role>(); 
     Benefits = new List<Benefit>(); 
    } 

    public virtual Id { get; set; } 
    public virtual Name { get; set; } 

    public virtual IList<Task> Tasks { get; protected set; } 
    public virtual IList<Role> Roles { get; protected set; } 
    public virtual IList<Benefit> Benefits { get; protected set; } 

    public virtual void AddTask(Task task) 
    { 
     task.Employee = this; 
     Tasks.Add(task); 
    } 
    public virtual void AddBenefit(Benefit benefit) 
    { 
     benefit.Employee = this; 
     Benefits.Add(benefit); 
    } 
    public virtual void AddBenefit(Benefit benefit) 
    { 
     benefit.Employee = this; 
     Benefits.Add(benefit); 
    } 
} 

public class EmployeeMapper : ClassMap<Employee> 
{ 
    public EmployeeMapper() 
    { 
     id(x => x.Id); 
     Map(x => x.Name); 
     HasMany(x => x.Tasks); 
     HasMany(x => x.Roles); 
     HasMany(x => x.Benefits); 
    } 
} 

現在whiel在這個例子中有僅3個集,還有就是它會成長,並與員工盡一切聯想成長的可能性。就像在一個人力資源系統中一樣,它將與薪資,地址,稅收,扣除等所有內容相關聯。如果我爲每一個我稱之爲小型參考的人創建一個集合,它會不會太誇張?

有沒有一種模式來避免這種情況來臨或是NHibernate的設計,以便我必須引用每個對象都有一個外鍵約束我的對象?

+1

僱員不必知道所有的FK引用到自身。只爲那些你實際需要通過員工參考的人做。 – dotjoe 2010-08-10 14:26:04

+0

所以這是否意味着維基說:「在雙方都被映射的關係中,NHibernate需要你在雙方都能正確保存之前設置雙方。」,「雙方都映射」意味着雙方都有一個引用其他?從我最初從該聲明中理解的內容來看,我認爲這必須在雙方都被映射到一個表格時完成。 – Jonn 2010-08-10 15:01:48

+1

是的,這僅僅意味着** IF **你映射雙方,那麼你需要明確地設置兩邊的屬性,如'parent.children.Add(child); child.parent =家長;' – dotjoe 2010-08-12 15:14:40

回答

2

員工不必知道每個fk對自己的引用。只爲那些你實際需要通過員工參考的人做。

在雙方都 映射關係

,NHibernate的需要你設置 雙方前,將正確保存 。

這只是意味着IF你映射雙方,則需要雙方明確設置的屬性,如

parent.children.Add(child); 
child.parent = parent; 
+0

如果你正在使用級聯,這仍然是真的嗎?在我看來,另一方會自動更新 – Shagglez 2011-07-22 09:35:19