我在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;
}
}
答案 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;
}