NHibernate单向,一对多,映射问题

时间:2009-02-09 18:04:40

标签: nhibernate one-to-many

我在NHibernate中有一个场景,我在实体Employee和EmployeeStatus之间有一对多的关系。

员工拥有以下属性:ID,名称和EmployeeStatus的IList,而EmployeeStatus,就此问题而言,只有自己的ID和一些自由文本。

我不需要从EmployeeStatus持有Employee的引用,status'的管理将完全通过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);

我尝试了各种方法,包括创建单向一对多映射,其中inverse为false,级联设置为all-delete-orphan,它们看起来都应该可以工作,但它会生成一个关于存在的异常无法在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;
  }
}

4 个答案:

答案 0 :(得分:2)

您描述的场景只是一个基本的一对多映射。这是Fluent NHibernate的映射:

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

您不需要将EmployeeStatus的引用维护回Employee来实现此目的。

答案 1 :(得分:0)

我可能没有清楚解释,但员工身份不能与多名员工挂钩。绝对是1(员工)到很多(状态')

在物理数据库中,状态实体有一个employeeID字段,该字段不在域中 - IE:我没有从状态实体返回员工的引用,但物理字段应该从所有者推断出集合 - 事实上,如果我将状态表中的EmployeeID字段设置为可空,它会执行此操作 - 它实际上执行2个SQL语句 - 插入然后更新,在更新中设置EmployeeID。

谢谢,

答案 2 :(得分:0)

原来我想做的事情是不可能的 - 你必须有双向关联,并且必须设置孩子的父参考。我想这不是一个大问题,但是不想在我的代码中直接在子代中保存引用。

答案 3 :(得分:-1)

你可以发布课程的代码吗?

您是否尝试保留员工的状态历史记录?

- 编辑 -
看起来你需要多对多,因为关系中的孩子(EmployeeStatus)没有引用回父(Employee)。

- 编辑2 -
如果要将插入作为对数据库的1调用完成,则需要将Employee属性添加到EmployeeStatus类,并设置Inverse = true。而且我很确定你需要添加一些逻辑来设置对象中的双向关系。 I.E.

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