实体:团队 <-> TeamEmployee <-> 员工
要求:
- 团队和员工可以在没有对应的情况下存在。
- 在 Team-TeamEmployee 关系中,团队负责(父级) [稍后使用 TeamRepository]。
- 在 Employee-TeamEmployee 关系中,Employee 负责(父) [稍后使用 EmployeeRepository]。
- 不允许重复。
- 如果员工不在另一个团队中,则删除团队会删除团队中的所有员工。
- 如果团队不包含更多员工,则删除员工只会删除团队。
映射:
public class TeamMap : ClassMap<Team>
{
public TeamMap()
{
// identity mapping
Id(p => p.Id)
.Column("TeamID")
.GeneratedBy.Identity();
// column mapping
Map(p => p.Name);
// associations
HasMany(p => p.TeamEmployees)
.KeyColumn("TeamID")
.Inverse()
.Cascade.SaveUpdate()
.AsSet()
.LazyLoad();
}
}
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
// identifier mapping
Id(p => p.Id)
.Column("EmployeeID")
.GeneratedBy.Identity();
// column mapping
Map(p => p.EMail);
Map(p => p.LastName);
Map(p => p.FirstName);
// associations
HasMany(p => p.TeamEmployees)
.Inverse()
.Cascade.SaveUpdate()
.KeyColumn("EmployeeID")
.AsSet()
.LazyLoad();
HasMany(p => p.LoanedItems)
.Cascade.SaveUpdate()
.LazyLoad()
.KeyColumn("EmployeeID");
}
}
public class TeamEmployeeMap : ClassMap<TeamEmployee>
{
public TeamEmployeeMap()
{
Id(p => p.Id);
References(p => p.Employee)
.Column("EmployeeID")
.LazyLoad();
References(p => p.Team)
.Column("TeamID")
.LazyLoad();
}
}
创建员工和团队:
var employee1 = new Employee { EMail = "Mail", FirstName = "Firstname", LastName = "Lastname" };
var team1 = new Team { Name = "Team1" };
var team2 = new Team { Name = "Team2" };
employee1.AddTeam(team1);
employee1.AddTeam(team2);
var employee2 = new Employee { EMail = "Mail2", FirstName = "Firstname2", LastName = "Lastname2" };
var team3 = new Team { Name = "Team3" };
employee2.AddTeam(team3);
employee2.AddTeam(team1);
team1.AddEmployee(employee1);
team1.AddEmployee(employee2);
team2.AddEmployee(employee1);
team3.AddEmployee(employee2);
session.SaveOrUpdate(team1);
session.SaveOrUpdate(team2);
session.SaveOrUpdate(team3);
session.SaveOrUpdate(employee1);
session.SaveOrUpdate(employee2);
在此之后,我使用 transaction.Commit() 提交更改。第一个奇怪的事情是我必须保存团队和员工,而不是只保存其中一个(为什么?!)。如果我只保存所有团队或(异或)所有员工,那么我会得到一个TransientObjectException:
“对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。类型:Core.Domain.Model.Employee,实体:Core.Domain.Model.Employee”
当我保存所有创建的团队和员工时,一切都保存得很好,但是关系表 TeamEmployee 有重复的关联。
ID EID TID
1 1 1
2 2 1
3 1 2
4 2 3
5 1 1
6 1 2
7 2 3
8 2 1
所以不是 4 个关系,而是 8 个关系。左侧有 4 个关系,右侧有 4 个关系。:[
我错了什么?
进一步的问题:当我删除团队或员工时,我是否必须从对象模型中的 TeamEmployee 列表中删除团队或员工,或者 NHibernate 是否为我完成了这项工作(使用 session.delete(..))?