NHibernate сущности и несколько ассоциаций - PullRequest
3 голосов
/ 10 августа 2010

Я не знаю, как правильно сформулировать вопрос, поэтому заранее извините.

В частности, используя FluentNHibernate, как бы вы делали свои сущности для некоторых таблиц, на которые ссылается множество других таблиц?

Например, сущность Сотрудник. Сотрудники обычно используются почти везде, и для некоторых программ было бы целесообразно, чтобы их сотрудники содержали несколько ролей, несколько задач или несколько преимуществ. Прямо сейчас я представляю это так:

public class Employee
{
    public virtual Employee()
    {
        Tasks = new List<Task>();
        Roles = new List<Role>();
        Benefits = new List<Benefit>();
    }

    public virtual Id { get; set; }
    public virtual Name { get; set; }

    public virtual IList<Task> Tasks { get; protected set; }
    public virtual IList<Role> Roles { get; protected set; }
    public virtual IList<Benefit> Benefits { get; protected set; }

    public virtual void AddTask(Task task)
    {
        task.Employee = this;
        Tasks.Add(task);
    }
    public virtual void AddBenefit(Benefit benefit)
    {
        benefit.Employee = this;
        Benefits.Add(benefit);
    }
    public virtual void AddBenefit(Benefit benefit)
    {
        benefit.Employee = this;
        Benefits.Add(benefit);
    }
}

public class EmployeeMapper : ClassMap<Employee>
{
    public EmployeeMapper()
    {
        id( x => x.Id );
        Map( x => x.Name );
        HasMany( x => x.Tasks );
        HasMany( x => x.Roles );
        HasMany( x => x.Benefits );
    }
}

Теперь, когда в этом примере есть только 3 коллекции, есть вероятность, что она будет расти и расти с каждой ассоциацией, связанной с сотрудником. Как и в системе управления персоналом, она будет связана со всем, начиная с платежной ведомости, адресов, налогов, вычетов и т. Д. Не станет ли она слишком раздутой, если я сделаю сборник для каждой небольшой ссылки, которую я называю?

Существует ли шаблон, позволяющий избежать этого сценария, или NHibernate разработан так, чтобы мне приходилось ссылаться на каждый отдельный объект, который имеет ограничение внешнего ключа на моих объектах?

1 Ответ

2 голосов
/ 20 августа 2010

Сотрудник не обязан знать о каждой ссылке на себя.Делайте это только для тех, кому вам действительно нужно обратиться через сотрудника.

в отношениях, в которых сопоставлены обе стороны, NHibernate требует, чтобы вы установили обе стороны, прежде чем он будет правильно сохранять.* вы отображаете обе стороны, тогда вам нужно явно установить свойства для обеих сторон, например

parent.children.Add(child); 
child.parent = parent;
...