2

В моем домене у сотрудника и отдела есть двунаправленные отношения «один ко многим»; чтобы позволить Child Employee синхронизировать это, у меня есть «внутреннее» поле доступа для набора (Iesi для NHibernate) сотрудников, которые находятся в отделе, которые в противном случае были бы общедоступными. Как так:шаблоны двунаправленных отношений с 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) Является ли это хорошо с шаблоном # программирования для readonly установлен в biderectional отношения?
2) Каков наилучший способ сделать это более пригодным для использования в NHibernate?

Спасибо за обмен!
Berryl

ответ

11

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

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

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

+0

Hi Jamie Прошу прощения за поздний кредит, так как это работает хорошо. Считаете ли вы, что можно было бы перевернуть логику и позволить внутреннему виду ISet? Как бы выглядело отображение? Еще раз спасибо за хороший ответ. – Berryl

+1

Мне пришлось сделать внутреннюю сетку отдела сотрудников Employee защищенной внутренней, чтобы FluentNH принимал ее как действительный тип прокси, но после этого он работал нормально. – David

Смежные вопросы