Nhibernate映射两个三元关联(我认为)
我遇到了一个非常有趣的映射场景。我有两个实体(Nhibernate映射两个三元关联(我认为),nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我遇到了一个非常有趣的映射场景。我有两个实体(Task和ProjectEmployeeFile),它们有两个相同的外键(ProjectId和EmployeeId) 我试图找到一种优雅的方法,将任务属性映射到项目员工文件实体 我认为一个外键关系的解决方案是使用三元关联,但我不知道如何将其投射到多个外键中 我使用的是fluent nhibernate,但是如果用经典的hbm文件解决这个问题,那么手动映射这些类就没有问题了 任何帮助都将不胜感激 我绘制了一个基本图表,试图说明该场景: 我在这里自由地
Task
和ProjectEmployeeFile
),它们有两个相同的外键(ProjectId
和EmployeeId
)
我试图找到一种优雅的方法,将任务
属性映射到项目员工文件
实体
我认为一个外键关系的解决方案是使用三元关联,但我不知道如何将其投射到多个外键中
我使用的是fluent nhibernate,但是如果用经典的hbm文件解决这个问题,那么手动映射这些类就没有问题了
任何帮助都将不胜感激
我绘制了一个基本图表,试图说明该场景:
我在这里自由地混合了属性名和数据库列名,但我认为总体思路是清楚的
更新
为了澄清域模型,以下是当前的实体和映射,它们被剥离到最低限度:
public class Task
{
public virtual int Id { get; private set; }
public virtual Project Project { get; set; }
public virtual Employee Employee { get; set; }
}
public class ProjectEmployeeFile
{
public virtual int Id { get; private set; }
public virtual Project Project { get; set; }
public virtual Employee Employee { get; set; }
}
public class Project
{
public virtual int Id { get; private set; }
public virtual IList<Task> Tasks { get; set; }
}
public class Employee
{
public virtual int Id { get; private set; }
public virtual IList<Task> Tasks { get; set; }
}
public class TaskMap : ClassMap<Task>
{
public TaskMap()
{
Table("Tasks");
Id(x => x.Id);
References(x => x.Project).Column("ProjectId");
References(x => x.Employee).Column("EmployeeId");
}
}
public class ProjectEmployeeFileMap : ClassMap<ProjectEmployeeFile>
{
public ProjectEmployeeFileMap()
{
Table("ProjectEmployeeFiles");
Id(x => x.Id);
References(x => x.Project).Column("ProjectId");
References(x => x.Employee).Column("EmployeeId");
}
}
公共类任务
{
公共虚拟整数Id{get;private set;}
公共虚拟项目{get;set;}
公共虚拟员工{get;set;}
}
公共类ProjectEmployeeFile
{
公共虚拟整数Id{get;private set;}
公共虚拟项目{get;set;}
公共虚拟员工{get;set;}
}
公共类项目
{
公共虚拟整数Id{get;private set;}
公共虚拟IList任务{get;set;}
}
公营雇员
{
公共虚拟整数Id{get;private set;}
公共虚拟IList任务{get;set;}
}
公共类任务映射:类映射
{
公共任务图()
{
表(“任务”);
Id(x=>x.Id);
参考文献(x=>x.Project)。列(“ProjectId”);
引用(x=>x.Employee).Column(“EmployeeId”);
}
}
公共类ProjectEmployeeFileMap:ClassMap
{
公共项目EmployeeFileMap()
{
表(“项目员工档案”);
Id(x=>x.Id);
参考文献(x=>x.Project)。列(“ProjectId”);
引用(x=>x.Employee).Column(“EmployeeId”);
}
}
...
我不知道是否可以用fluent来实现,但你可以将它们混合使用。混合使用关系和面向对象的概念确实会使事情变得复杂。我可以帮助您进行映射,但请先创建一个真正的域模型。@Diego:我已经更新了问题的更多细节,包括实体及其当前映射。谢谢我不明白项目员工档案的目的。它与任务具有相同的属性。它代表什么?@Diego:我省略了所有不相关的属性。员工在项目中可以有许多任务。任何相关员工项目对的ProjectEmployeeFile只存在一次。它包含有关员工参与项目的数据、他签署的文件、他在项目中的工资、他的可用性等。最大的问题是我应该如何映射此“任务”属性?谢谢,我明天会尝试。最终没有尝试并找到另一个解决方案。无论如何,现在它可以工作了,FNH也支持它:
<class name="ProjectEmployeeFile">
...
<bag name="Tasks" inverse="true">
<key column="ProjectId" property-ref="Project"/>
<key column="EmployeeId" property-ref="Employee"/>
<one-to-many class="Task"/>
</bag>
</class>