2

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

Employee 具有属性,例如:ID、Name 和 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);

我尝试了各种方法,包括创建一个单向一对多映射,其中 inverse 为假,级联设置为 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

4 回答 4

2

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

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

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

于 2009-07-30T16:08:45.313 回答
0

我可能没有解释清楚,但员工身份不能与多个员工相关联。绝对是 1(员工)对许多(状态)

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

谢谢,

托尼

于 2009-02-09T18:37:46.067 回答
0

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

于 2009-02-10T10:59:23.670 回答
-1

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

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

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

-- 编辑 2 --
如果您希望插入作为对 DB 的 1 次调用完成,您将需要向 EmployeeStatus 类添加一个 Employee 属性,并设置 Inverse=true。而且我很确定您将需要添加一些逻辑来设置对象中的双向关系。IE

public void AddStatus(EmployeeStatus status)
{
    this.StatusList.Add(status);
    status.Employee = this;
}
于 2009-02-09T18:16:41.933 回答