我遇到了一个非常有趣的映射场景。我有两个实体(Task
和ProjectEmployeeFile
),它们有两个相同的外键(ProjectId
和EmployeeId
)。
我正在尝试找到一种将Tasks
属性映射到ProjectEmployeeFile
实体的优雅方式。
我认为一个外键关系的解决方案是使用三元关联,但我不知道如何将其投影到多个外键中。
我正在使用流利的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");
}
}
答案 0 :(得分:0)
答案 1 :(得分:0)
此映射可能有效(我尚未对其进行测试):
<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>
我不知道是否可以流利地做到这一点,但你可以将它们混合起来。