Nhibernate映射两个三元关联(我认为)

时间:2011-03-01 12:26:38

标签: nhibernate fluent-nhibernate nhibernate-mapping

我遇到了一个非常有趣的映射场景。我有两个实体(TaskProjectEmployeeFile),它们有两个相同的外键(ProjectIdEmployeeId)。

我正在尝试找到一种将Tasks属性映射到ProjectEmployeeFile实体的优雅方式。

我认为一个外键关系的解决方案是使用三元关联,但我不知道如何将其投影到多个外键中。

我正在使用流利的nhibernate,但如果用经典的hbm文件解决这个问题就行了,我手动映射这些类没有问题。

非常感谢任何帮助。

我绘制了一个基本图表来试图说明这个场景:

A basic diagram to try to illustrate my scenario

我在这里可以自由地使用数据库列名称混合属性名称,但我认为一般的想法是明确的。

更新

为了澄清域模型,这里是当前实体和映射,剥离到最小:

    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");
    }
}

2 个答案:

答案 0 :(得分:0)

  1. 三级关联应在DB级别完成
  2. 在代码中,只需将Tasks集合属性添加到ProjectEmployeeFile即可 为什么这还不够?

答案 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>

我不知道是否可以流利地做到这一点,但你可以将它们混合起来。