2009-02-09 198 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参考回到员工来实现这一目标。