Nhibernate отображает две троичные ассоциации (я думаю) - PullRequest
0 голосов
/ 01 марта 2011

Я столкнулся с довольно интересным сценарием картирования. У меня есть две сущности (Task и ProjectEmployeeFile), которые имеют два одинаковых внешних ключа (ProjectId и EmployeeId).

Я пытаюсь найти элегантный способ сопоставления свойства 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 голосов
/ 02 марта 2011

Это отображение может работать (я его не проверял):

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

Я не знаю, возможно ли это сделать бегло, но вы все равно можете их смешать.

0 голосов
/ 01 марта 2011
  1. Тройная ассоциация должна выполняться на уровне БД
  2. В коде просто добавьте свойство коллекции Tasks в ProjectEmployeeFile Почему этого недостаточно?
...