2010-08-10 87 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