Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate映射两个三元关联(我认为)_Nhibernate_Fluent Nhibernate_Nhibernate Mapping - Fatal编程技术网

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”);
}
}
  • 三元关联应在DB级别进行
  • 在代码中,只需将Tasks集合属性添加到ProjectEmployeeFile 为什么这还不够
  • 此映射可能有效(我尚未测试):

    
    ...
    

    我不知道是否可以用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>