шаблоны двунаправленных отношений с nhibernate - PullRequest
2 голосов
/ 15 апреля 2009

В моем домене Сотрудник и Департамент имеют двустороннюю связь один-ко-многим; чтобы позволить дочернему сотруднику синхронизировать это, у меня есть «внутреннее» поле доступа для набора (то есть для NHibernate) сотрудников, которые находятся в отделе, которые в противном случае были бы доступны только для чтения. Вот так:

Класс отдела:

protected internal ISet<Employee> _staff;  
public virtual ReadOnlyCollection<Employee> Staff {  
   get { return new List<Employee>(_staff).AsReadOnly(); }   
}  
public virtual void AddStaff(Employee emp) {
    emp.Department = this;  } 
}

Класс сотрудника:

private Department _department;
public virtual Department Department {
   set {
       // check valid value, etc.
       value._staff.Add(this);
   }
}

Я сделал доступ в своем (FNH) сопоставлении AsField (Prefix.Underscore), но так как я не могу сделать поле Department._staff виртуальным NH, это не устраивает. Полагаю, я мог бы сделать поле виртуальным свойством и принудительно кормить его, но такое чувство, что я делаю класс домена чрезмерно осведомленным о постоянстве.

Я изучаю как NH, так и FNH, и я знаю, что мне нужен хороший учебник по картированию отношений, но мой основной вопрос для этого поста - логика в моих классах предметной области:
1) Является ли это хорошим шаблоном программирования на C # для набора только для чтения в двунаправленной взаимосвязи?
2) Каков наилучший способ сделать это более удобным для NHibernate?

Спасибо, что поделились!
Berryl

1 Ответ

11 голосов
/ 15 апреля 2009

Я реализую отношения один ко многим, используя этот шаблон:

public class Department
{
    private IList<Employee> _staff = new List<Staff>();

    public virtual IEnumerable<Employee> Staff
    {
        get { return _staff; }
    }

    // Add and Remove have additional checks in them as needed

    public virtual void AddStaff(Employee staff)
    {
        staff.Department = this;
        _staff.Add(staff);
    }

    public virtual void RemoveStaff(Employee staff)
    {
        staff.Department = null;
        _staff.Remove(staff);
    }
}

public class Employee
{
    public virtual Department Department { get; internal set; }
}

В этом случае Департамент является обратной стороной отношений.

...